diff --git a/.github/workflows/check-format.yml b/.github/workflows/check-format.yml new file mode 100644 index 000000000..d616e7ac3 --- /dev/null +++ b/.github/workflows/check-format.yml @@ -0,0 +1,29 @@ +# This workflow will run the linter checks from a new hatch environment. + + +name: Check code format + +on: + pull_request: + branches: + - main + - feature/** + +permissions: + contents: read + +jobs: + check-code-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - name: Set up Python + uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0 + with: + python-version: '3.9' # Minimum supported Python version + - name: Install dependencies + run: | + pip install hatch + - name: Run code format checks + run: | + hatch run lint:style diff --git a/.gitignore b/.gitignore index 6064621be..f22a65048 100644 --- a/.gitignore +++ b/.gitignore @@ -142,3 +142,7 @@ examples/hybrid_jobs/2_Using_PennyLane_with_Braket_Jobs/input-data.adjlist # Notebook artifacts */3_Deep_dive_into_the_anatomy_of_quantum_circuits/device_logs-*.txt +examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/embedded-simulation-* +examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/braket-job-default-* +examples/**/model.tar.gz +examples/**results.json diff --git a/examples/advanced_circuits_algorithms/Grover/Grover.ipynb b/examples/advanced_circuits_algorithms/Grover/Grover.ipynb index bad4ea323..16d53612e 100644 --- a/examples/advanced_circuits_algorithms/Grover/Grover.ipynb +++ b/examples/advanced_circuits_algorithms/Grover/Grover.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -181,10 +182,12 @@ "outputs": [], "source": [ "# Import Braket libraries\n", - "from braket.circuits import circuit, Circuit\n", - "from braket.aws import AwsQuantumTask, AwsDevice\n", - "from braket.devices import Devices, LocalSimulator\n", "import matplotlib.pyplot as plt\n", + "\n", + "from braket.aws import AwsDevice, AwsQuantumTask\n", + "from braket.circuits import Circuit, circuit\n", + "from braket.devices import Devices, LocalSimulator\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline\n", "import numpy as np" @@ -222,36 +225,41 @@ " implementation of three-qubit gate CCZ\n", " \"\"\"\n", " # define three-qubit CCZ gate\n", - " ccz_gate = np.array([[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", - " [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", - " [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", - " [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],\n", - " [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],\n", - " [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0],\n", - " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0],\n", - " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0]],\n", - " dtype=complex)\n", - " \n", + " ccz_gate = np.array(\n", + " [\n", + " [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", + " [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", + " [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n", + " [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],\n", + " [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0],\n", + " [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0],\n", + " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0],\n", + " [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0],\n", + " ],\n", + " dtype=complex,\n", + " )\n", + "\n", " # instantiate circuit object\n", " circ = Circuit()\n", - " \n", + "\n", " # add CCZ gate\n", " circ.unitary(matrix=ccz_gate, targets=targets)\n", - " \n", + "\n", " return circ\n", "\n", "\n", "# All possible items and their corresponding oracles\n", "# define oracle dictionary using this CCZ gate\n", - "oracle_sim = {\"000\": Circuit().x([0,1,2]).ccz(targets=[0, 1, 2]).x([0,1,2]),\n", - " \"001\": Circuit().x([0,1]).ccz(targets=[0, 1, 2]).x([0,1]),\n", - " \"010\": Circuit().x([0,2]).ccz(targets=[0, 1, 2]).x([0,2]),\n", - " \"011\": Circuit().x([0]).ccz(targets=[0, 1, 2]).x([0]),\n", - " \"100\": Circuit().x([1,2]).ccz(targets=[0, 1, 2]).x([1,2]),\n", - " \"101\": Circuit().x([1]).ccz(targets=[0, 1, 2]).x([1]),\n", - " \"110\": Circuit().x([2]).ccz(targets=[0, 1, 2]).x([2]),\n", - " \"111\": Circuit().ccz(targets=[0, 1, 2])\n", - " }\n", + "oracle_sim = {\n", + " \"000\": Circuit().x([0, 1, 2]).ccz(targets=[0, 1, 2]).x([0, 1, 2]),\n", + " \"001\": Circuit().x([0, 1]).ccz(targets=[0, 1, 2]).x([0, 1]),\n", + " \"010\": Circuit().x([0, 2]).ccz(targets=[0, 1, 2]).x([0, 2]),\n", + " \"011\": Circuit().x([0]).ccz(targets=[0, 1, 2]).x([0]),\n", + " \"100\": Circuit().x([1, 2]).ccz(targets=[0, 1, 2]).x([1, 2]),\n", + " \"101\": Circuit().x([1]).ccz(targets=[0, 1, 2]).x([1]),\n", + " \"110\": Circuit().x([2]).ccz(targets=[0, 1, 2]).x([2]),\n", + " \"111\": Circuit().ccz(targets=[0, 1, 2]),\n", + "}\n", "\n", "\n", "# helper function for initialization\n", @@ -260,9 +268,9 @@ " function to apply hadamard to all qubits\n", " \"\"\"\n", " # Initialize with superposition\n", - " circ = Circuit();\n", + " circ = Circuit()\n", " circ.h(np.arange(n_qubits))\n", - " #print(circ)\n", + " # print(circ)\n", " return circ\n", "\n", "\n", @@ -273,10 +281,10 @@ " \"\"\"\n", " # instantiate circuit object\n", " circ = Circuit()\n", - " \n", + "\n", " # add oracle\n", " circ.add_circuit(oracle_sim[item])\n", - " \n", + "\n", " return circ\n", "\n", "\n", @@ -287,12 +295,12 @@ " \"\"\"\n", " # instantiate circuit object\n", " circ = Circuit()\n", - " \n", + "\n", " # Amplification\n", " circ.h(np.arange(n_qubits))\n", - " circ.add_circuit(oracle_sim['000'])\n", + " circ.add_circuit(oracle_sim[\"000\"])\n", " circ.h(np.arange(n_qubits))\n", - " \n", + "\n", " return circ\n", "\n", "\n", @@ -311,9 +319,8 @@ " # amplify\n", " amplification = amplify()\n", " grover_circ.add(amplification)\n", - " \n", - " return grover_circ\n", - " " + "\n", + " return grover_circ" ] }, { @@ -329,7 +336,6 @@ "source": [ "# Function to run quantum task, check the status thereof, and collect results\n", "def get_result(circ):\n", - " \n", " # get number of qubits\n", " num_qubits = circ.qubit_count\n", "\n", @@ -340,27 +346,25 @@ " task = device.run(circ, shots=1000)\n", "\n", " # Get ID of submitted quantum task\n", - " task_id = task.id\n", - "# print('Task ID :', task_id)\n", + " # print('Task ID :', task_id)\n", "\n", " # Wait for hybrid job to complete\n", " status_list = []\n", " status = task.state()\n", " status_list += [status]\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", "\n", " # Only notify the user when there's a status change\n", - " while status != 'COMPLETED':\n", + " while status != \"COMPLETED\":\n", " status = task.state()\n", " if status != status_list[-1]:\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", " status_list += [status]\n", "\n", " # get result\n", " result = task.result()\n", "\n", " # get metadata\n", - " metadata = result.task_metadata\n", "\n", " # get output probabilities\n", " probs_values = result.values[0]\n", @@ -369,18 +373,17 @@ " measurement_counts = result.measurement_counts\n", "\n", " # print measurement results\n", - " print('measurement_counts:', measurement_counts)\n", + " print(\"measurement_counts:\", measurement_counts)\n", "\n", " # bitstrings\n", - " format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + " format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", " bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", " # plot probabalities\n", - " plt.bar(bitstring_keys, probs_values);\n", - " plt.xlabel('bitstrings');\n", - " plt.ylabel('probability');\n", - " plt.xticks(rotation=90);\n", - " \n", + " plt.bar(bitstring_keys, probs_values)\n", + " plt.xlabel(\"bitstrings\")\n", + " plt.ylabel(\"probability\")\n", + " plt.xticks(rotation=90)\n", " return measurement_counts" ] }, @@ -405,7 +408,7 @@ }, "outputs": [], "source": [ - "# Set up the cloud-based simulator \n", + "# Set up the cloud-based simulator\n", "# device = AwsDevice(Devices.Amazon.SV1)\n", "\n", "# set up the local simulator\n", @@ -434,12 +437,14 @@ "source": [ "# get device name\n", "device_name = device.name\n", - "# show the properties of the device \n", + "# show the properties of the device\n", "device_properties = device.properties\n", "# show supportedQuantumOperations (supported gates for a device)\n", - "device_operations = device_properties.dict()['action']['braket.ir.jaqcd.program']['supportedOperations']\n", + "device_operations = device_properties.dict()[\"action\"][\"braket.ir.jaqcd.program\"][\n", + " \"supportedOperations\"\n", + "]\n", "# Note: This field also exists for other devices like the QPUs\n", - "print('Quantum Gates supported by {}:\\n {}'.format(device_name, device_operations))" + "print(\"Quantum Gates supported by {}:\\n {}\".format(device_name, device_operations))" ] }, { @@ -693,12 +698,14 @@ "source": [ "# get device name\n", "device_name = device.name\n", - "# show the properties of the device \n", + "# show the properties of the device\n", "device_properties = device.properties\n", "# show supportedQuantumOperations (supported gates for a device)\n", - "device_operations = device_properties.dict()['action']['braket.ir.openqasm.program']['supportedOperations']\n", + "device_operations = device_properties.dict()[\"action\"][\"braket.ir.openqasm.program\"][\n", + " \"supportedOperations\"\n", + "]\n", "# Note: This field also exists for other devices like the QPUs\n", - "print('Quantum Gates supported by {}:\\n {}'.format(device_name, device_operations))" + "print(\"Quantum Gates supported by {}:\\n {}\".format(device_name, device_operations))" ] }, { @@ -725,9 +732,27 @@ " build CCNOT from H, CNOT, T, Ti\n", " \"\"\"\n", " cQb1, cQb2 = controls\n", - " circ = Circuit().h(target).cnot(cQb2,target).ti(target).cnot(cQb1,target).t(target).cnot(cQb2,target).ti(target).cnot(cQb1,target).t(target).h(target).t(cQb2).cnot(cQb1,cQb2).t(cQb1).ti(cQb2).cnot(cQb1,cQb2)\n", - " \n", - " return circ \n", + " circ = (\n", + " Circuit()\n", + " .h(target)\n", + " .cnot(cQb2, target)\n", + " .ti(target)\n", + " .cnot(cQb1, target)\n", + " .t(target)\n", + " .cnot(cQb2, target)\n", + " .ti(target)\n", + " .cnot(cQb1, target)\n", + " .t(target)\n", + " .h(target)\n", + " .t(cQb2)\n", + " .cnot(cQb1, cQb2)\n", + " .t(cQb1)\n", + " .ti(cQb2)\n", + " .cnot(cQb1, cQb2)\n", + " )\n", + "\n", + " return circ\n", + "\n", "\n", "def CCZ_ionq(controls=[0, 1], target=2):\n", " \"\"\"\n", @@ -736,6 +761,7 @@ " circ = Circuit().h(target).CCNot(controls, target).h(target)\n", " return circ\n", "\n", + "\n", "ccz_ionq = CCZ_ionq()" ] }, @@ -758,15 +784,16 @@ "outputs": [], "source": [ "# Four possible items and their corresponding oracles\n", - "oracle_ionq = {\"000\": Circuit().x([0,1,2]).add(ccz_ionq).x([0,1,2]),\n", - " \"001\": Circuit().x([0,1]).add(ccz_ionq).x([0,1]),\n", - " \"010\": Circuit().x([0,2]).add(ccz_ionq).x([0,2]),\n", - " \"011\": Circuit().x([0]).add(ccz_ionq).x([0]),\n", - " \"100\": Circuit().x([1,2]).add(ccz_ionq).x([1,2]),\n", - " \"101\": Circuit().x([1]).add(ccz_ionq).x([1]),\n", - " \"110\": Circuit().x([2]).add(ccz_ionq).x([2]),\n", - " \"111\": Circuit().add(ccz_ionq)\n", - " }" + "oracle_ionq = {\n", + " \"000\": Circuit().x([0, 1, 2]).add(ccz_ionq).x([0, 1, 2]),\n", + " \"001\": Circuit().x([0, 1]).add(ccz_ionq).x([0, 1]),\n", + " \"010\": Circuit().x([0, 2]).add(ccz_ionq).x([0, 2]),\n", + " \"011\": Circuit().x([0]).add(ccz_ionq).x([0]),\n", + " \"100\": Circuit().x([1, 2]).add(ccz_ionq).x([1, 2]),\n", + " \"101\": Circuit().x([1]).add(ccz_ionq).x([1]),\n", + " \"110\": Circuit().x([2]).add(ccz_ionq).x([2]),\n", + " \"111\": Circuit().add(ccz_ionq),\n", + "}" ] }, { @@ -821,7 +848,7 @@ ], "source": [ "# Initialize with superposition\n", - "circ = Circuit();\n", + "circ = Circuit()\n", "circ.h(np.arange(3))\n", "print(circ)" ] @@ -905,7 +932,7 @@ "source": [ "# Amplification\n", "circ.h(np.arange(3))\n", - "circ.add_circuit(oracle_ionq['000'])\n", + "circ.add_circuit(oracle_ionq[\"000\"])\n", "circ.h(np.arange(3))\n", "print(circ)" ] @@ -945,14 +972,14 @@ "# set up device\n", "ionq = AwsDevice(Devices.IonQ.Aria1)\n", "\n", - "# run circuit \n", + "# run circuit\n", "ionq_task = ionq.run(circ, shots=1000)\n", "\n", "# get id and status of submitted quantum task\n", "ionq_task_id = ionq_task.id\n", "ionq_status = ionq_task.state()\n", "# print('ID of task:', ionq_task_id)\n", - "print('Status of task:', ionq_status)" + "print(\"Status of task:\", ionq_status)" ] }, { @@ -976,7 +1003,7 @@ "source": [ "# print status\n", "status = ionq_task.state()\n", - "print('Status of (reconstructed) task:', status)" + "print(\"Status of (reconstructed) task:\", status)" ] }, { @@ -1000,7 +1027,7 @@ "source": [ "# print status\n", "status = ionq_task.state()\n", - "print('Status of (reconstructed) quantum task:', status)" + "print(\"Status of (reconstructed) quantum task:\", status)" ] }, { @@ -1028,40 +1055,39 @@ "\n", "# print status\n", "status = task_load.state()\n", - "print('Status of (reconstructed) quantum task:', status)\n", + "print(\"Status of (reconstructed) quantum task:\", status)\n", "\n", "# wait for hybrid job to complete\n", "# terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", - "if status == 'COMPLETED':\n", + "if status == \"COMPLETED\":\n", " # get results\n", " results = task_load.result()\n", - " \n", + "\n", " # get all metadata of submitted quantum task\n", " metadata = task_load.metadata()\n", " # example for metadata\n", - " shots = metadata['shots']\n", - " machine = metadata['deviceArn']\n", + " shots = metadata[\"shots\"]\n", + " machine = metadata[\"deviceArn\"]\n", " # print example metadata\n", " print(\"{} shots taken on machine {}.\".format(shots, machine))\n", - " \n", + "\n", " # get measurement counts\n", " counts = results.measurement_counts\n", - " print('Measurement counts:', counts)\n", + " print(\"Measurement counts:\", counts)\n", "\n", " # plot results: see effects of noise\n", - " plt.bar(counts.keys(), counts.values());\n", - " plt.xlabel('bitstrings');\n", - " plt.ylabel('counts');\n", - " plt.tight_layout();\n", - " plt.savefig('ionq.png', dpi=700);\n", - " \n", - "elif status in ['FAILED', 'CANCELLED']:\n", - " # print terminal message \n", - " print('Your quantum task is in terminal status, but has not completed.')\n", + " plt.bar(counts.keys(), counts.values())\n", + " plt.xlabel(\"bitstrings\")\n", + " plt.ylabel(\"counts\")\n", + " plt.tight_layout()\n", + " plt.savefig(\"ionq.png\", dpi=700)\n", + "elif status in [\"FAILED\", \"CANCELLED\"]:\n", + " # print terminal message\n", + " print(\"Your quantum task is in terminal status, but has not completed.\")\n", "\n", "else:\n", " # print current status\n", - " print('Sorry, your quantum task is still being processed and has not been finalized yet.')" + " print(\"Sorry, your quantum task is still being processed and has not been finalized yet.\")" ] }, { @@ -1109,8 +1135,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] } ], diff --git a/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/Quantum_Amplitude_Amplification.ipynb b/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/Quantum_Amplitude_Amplification.ipynb index dc591f7e1..d86627b95 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/Quantum_Amplitude_Amplification.ipynb +++ b/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/Quantum_Amplitude_Amplification.ipynb @@ -237,8 +237,9 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline" ] @@ -255,7 +256,7 @@ "outputs": [], "source": [ "# AWS imports: Import Braket SDK modules\n", - "from braket.circuits import Circuit, circuit\n", + "from braket.circuits import Circuit, circuit # noqa: F401\n", "from braket.devices import LocalSimulator" ] }, @@ -271,8 +272,8 @@ "outputs": [], "source": [ "# local imports\n", - "from utils_circuit import get_unitary, adjoint\n", - "from utils_qaa import qaa\n", + "from utils_circuit import adjoint, get_unitary\n", + "from utils_qaa import qaa # noqa: F401\n", "\n", "# monkey patch get_unitary() and adjoint() to the Circuit class\n", "Circuit.get_unitary = get_unitary\n", @@ -492,7 +493,7 @@ } ], "source": [ - "qubits = [0,1,2,3]\n", + "qubits = [0, 1, 2, 3]\n", "circ = Circuit()\n", "circ.minus_R_zero(qubits)\n", "print(circ)" @@ -711,9 +712,9 @@ "# Set up the state A|00>\n", "flag_qubit = 1\n", "epsilon = 0.05\n", - "A_circ = Circuit().ry(0, epsilon).cnot(0,1)\n", + "A_circ = Circuit().ry(0, epsilon).cnot(0, 1)\n", "\n", - "# Add marginal probability for flag qubit as result Type \n", + "# Add marginal probability for flag qubit as result Type\n", "A_circ.probability(target=[flag_qubit])\n", "\n", "# Let's find the probability of measuring |11> for different values of m, the number of applications of QAA:\n", @@ -721,33 +722,32 @@ "stepsize = 2\n", "iterations = range(1, 40, stepsize)\n", "for m in iterations:\n", - " \n", " # Get circuit object\n", " circ = Circuit()\n", " # Apply QAA using A defined by A_circ\n", " circ.qaa(A_circ, flag_qubit, m, use_explicit_unitary=True)\n", - " \n", + "\n", " # Classically simulate the circuit\n", " # Give the correct device.run call depending on whether the device is local or on-demand\n", " if isinstance(device, LocalSimulator):\n", " task = device.run(circ, shots=0)\n", " else:\n", " task = device.run(circ, shots=1000)\n", - " \n", + "\n", " # Get result\n", " result = task.result()\n", " # Append the probability of measuring |11> for this value of m.\n", " probabilities.append(result.values[0][1])\n", "\n", "# Get analytical result for comparison\n", - "probs_theo = [np.sin((2*mm+1)*epsilon/2)**2 for mm in iterations]\n", - " \n", + "probs_theo = [np.sin((2 * mm + 1) * epsilon / 2) ** 2 for mm in iterations]\n", + "\n", "# Plot the results\n", - "plt.figure(figsize=(7,5))\n", - "plt.plot(iterations, probabilities, 'o');\n", - "plt.plot(iterations, probs_theo);\n", - "plt.xlabel('Number of Iterations');\n", - "plt.ylabel('Probability of measuring flag qubit in |1>');" + "plt.figure(figsize=(7, 5))\n", + "plt.plot(iterations, probabilities, \"o\")\n", + "plt.plot(iterations, probs_theo)\n", + "plt.xlabel(\"Number of Iterations\")\n", + "plt.ylabel(\"Probability of measuring flag qubit in |1>\");" ] }, { @@ -849,7 +849,7 @@ "# Set up the state A|00>\n", "flag_qubit = 1\n", "epsilon = 0.05\n", - "A_circ = Circuit().ry(0, epsilon).cnot(0,1)\n", + "A_circ = Circuit().ry(0, epsilon).cnot(0, 1)\n", "\n", "# set switch to either use explicit unitary diag(-1, 1, ...) [True] or use ancillas [False]\n", "use_explicit_unitary = True\n", @@ -859,54 +859,52 @@ "stepsize = 2\n", "iterations = range(1, 40, stepsize)\n", "for m in iterations:\n", - " \n", " # Get circuit object\n", " circ = Circuit()\n", " # Apply QAA using A defined by A_circ\n", " circ.qaa(A_circ, flag_qubit, m, use_explicit_unitary=use_explicit_unitary)\n", - " \n", + "\n", " if use_explicit_unitary:\n", - " target_string = '11'\n", + " target_string = \"11\"\n", " circ.amplitude(state=[target_string])\n", " else:\n", " number_ancillas = A_circ.qubit_count - 1\n", - " target_string = '11'+'0'*number_ancillas\n", + " target_string = \"11\" + \"0\" * number_ancillas\n", " circ.amplitude(state=[target_string])\n", - " \n", + "\n", " # Classically simulate the circuit\n", " # Execute the correct device.run call depending on whether the device is local or on-demand\n", " if isinstance(device, LocalSimulator):\n", " task = device.run(circ, shots=0)\n", " else:\n", " task = device.run(circ, shots=0)\n", - " \n", + "\n", " # Get result\n", - " result = task.result() \n", + " result = task.result()\n", " # Append the probability of measuring |11> for this value of m.\n", - " probabilities.append(np.linalg.norm(result.values[0][target_string])**2)\n", + " probabilities.append(np.linalg.norm(result.values[0][target_string]) ** 2)\n", "\n", "# Get analytical result for comparison\n", - "probs_theo = [np.sin((2*mm+1)*epsilon/2)**2 for mm in iterations]\n", - " \n", - "# Plot the results\n", - "plt.figure(figsize=(7,5))\n", - "plt.plot(iterations, probabilities);\n", - "plt.plot(iterations, probs_theo, 'o');\n", - "plt.xlabel('Number of Iterations');\n", - "plt.ylabel('Probability of measuring 11');\n", + "probs_theo = [np.sin((2 * mm + 1) * epsilon / 2) ** 2 for mm in iterations]\n", "\n", + "# Plot the results\n", + "plt.figure(figsize=(7, 5))\n", + "plt.plot(iterations, probabilities)\n", + "plt.plot(iterations, probs_theo, \"o\")\n", + "plt.xlabel(\"Number of Iterations\")\n", + "plt.ylabel(\"Probability of measuring 11\")\n", "# Let's compare the amplitude of |11> in the initial state versus the state with maximum probability:\n", "# Print the initial amplitude of |11>\n", "\n", "# Add a Result Type to output the amplitude of |11> for A\n", "A_initial = A_circ.copy()\n", - "A_initial.amplitude(state=['11'])\n", + "A_initial.amplitude(state=[\"11\"])\n", "\n", "if isinstance(device, LocalSimulator):\n", " initial_result = device.run(A_initial, shots=0).result()\n", "else:\n", " initial_result = device.run(A_initial, shots=0).result()\n", - "print(\"Amplitude <11|Initial State>:\\n\", initial_result.values[0],\"\\n\")\n", + "print(\"Amplitude <11|Initial State>:\\n\", initial_result.values[0], \"\\n\")\n", "\n", "# Find the number of iterations required to achieve the maximum probability:\n", "max_prob = max(probabilities)\n", @@ -927,7 +925,7 @@ "\n", "# Print the final amplitude of |11>:\n", "info = \"Maximum amplified amplitude <110|Final State> after approximately\"\n", - "print(info+\" {} Grover iterations:\\n {}\".format(max_iter, result.values[0]))" + "print(info + \" {} Grover iterations:\\n {}\".format(max_iter, result.values[0]))" ] }, { diff --git a/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_circuit.py b/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_circuit.py index 39bbabd7a..86dd13524 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_circuit.py +++ b/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_circuit.py @@ -1,4 +1,5 @@ import numpy as np + from braket.circuits import Circuit @@ -13,11 +14,10 @@ def get_unitary(self): # Define the unitary matrix. Start with the identity matrix. # Reshape the unitary into a tensor with the right number of indices (given by num_qubits) - unitary = np.reshape(np.eye(2 ** num_qubits, 2 ** num_qubits), [2] * 2 * num_qubits) + unitary = np.reshape(np.eye(2**num_qubits, 2**num_qubits), [2] * 2 * num_qubits) # Iterate over the moments in the circuit for key in self.moments: - # Get the matrix corresponding to the gate matrix = self.moments[key].operator.to_matrix() # Get the target indices for the gate @@ -51,7 +51,7 @@ def get_unitary(self): unitary = np.transpose(unitary, inverse_permutation) # Reshape to a 2^N x 2^N matrix (for N=num_qubits)and return - unitary = np.reshape(unitary, (2 ** num_qubits, 2 ** num_qubits)) + unitary = np.reshape(unitary, (2**num_qubits, 2**num_qubits)) return unitary diff --git a/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_qaa.py b/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_qaa.py index 235f0a7c3..206543468 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_qaa.py +++ b/examples/advanced_circuits_algorithms/Quantum_Amplitude_Amplification/utils_qaa.py @@ -1,11 +1,13 @@ import numpy as np -from braket.circuits import Circuit, circuit from utils_circuit import adjoint, get_unitary +from braket.circuits import Circuit, circuit + # monkey patch to Circuit class Circuit.get_unitary = get_unitary Circuit.adjoint = adjoint + # helper function to apply XZX to given qubit @circuit.subroutine(register=True) def minus_R_B(qubit): @@ -57,7 +59,6 @@ def minus_R_zero(qubits, use_explicit_unitary=False): # For more qubits, we use Toffoli (or CCNOT) gates to check that all the qubits are in |1> (since we applied X) else: - # Dynamically add ancilla qubits, starting on the next unused qubit in the circuit # TODO: if this subroutine is being applied to a subset of qubits in a circuit, these ancilla # registers might already be used. We could pass in circ as an argument and add ancillas outside of @@ -110,9 +111,7 @@ def grover_iterator(A, flag_qubit, qubits=None, use_explicit_unitary=False): # If qubits are passed, make sure it's the right number to remap from A. if len(qubits) != len(A.qubits): raise ValueError( - "Number of desired target qubits differs from number of targets in A".format( - flag_qubit=repr(flag_qubit) - ) + "Number of desired target qubits differs from number of targets in A".format() ) # Verify that flag_qubit is one of the qubits on which A acts, or one of the user defined qubits diff --git a/examples/advanced_circuits_algorithms/Quantum_Fourier_Transform/Quantum_Fourier_Transform.ipynb b/examples/advanced_circuits_algorithms/Quantum_Fourier_Transform/Quantum_Fourier_Transform.ipynb index cc03f9543..3a5f57958 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Fourier_Transform/Quantum_Fourier_Transform.ipynb +++ b/examples/advanced_circuits_algorithms/Quantum_Fourier_Transform/Quantum_Fourier_Transform.ipynb @@ -166,9 +166,11 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", "import math\n", + "\n", "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline" ] @@ -238,11 +240,11 @@ "outputs": [], "source": [ "# qft subroutine without swaps\n", - "def qft_no_swap(qubits): \n", + "def qft_no_swap(qubits):\n", " \"\"\"\n", " Subroutine of the QFT excluding the final SWAP gates, applied to the qubits argument.\n", " Returns the a circuit object.\n", - " \n", + "\n", " Args:\n", " qubits (int): The list of qubits on which to apply the QFT\n", " \"\"\"\n", @@ -250,21 +252,21 @@ " # On a single qubit, the QFT is just a Hadamard.\n", " if len(qubits) == 1:\n", " return Circuit().h(qubits)\n", - " \n", + "\n", " # For more than one qubit, we define the QFT recursively (as shown on the right half of the image above):\n", " else:\n", " qftcirc = Circuit()\n", - " \n", + "\n", " # First add a Hadamard gate\n", " qftcirc.h(qubits[0])\n", - " \n", + "\n", " # Then apply the controlled rotations, with weights (angles) defined by the distance to the control qubit.\n", " for k, qubit in enumerate(qubits[1:]):\n", - " qftcirc.cphaseshift(qubit, qubits[0], 2*math.pi/(2**(k+2)))\n", - " \n", + " qftcirc.cphaseshift(qubit, qubits[0], 2 * math.pi / (2 ** (k + 2)))\n", + "\n", " # Now apply the above gates recursively to the rest of the qubits\n", " qftcirc.add(qft_no_swap(qubits[1:]))\n", - " \n", + "\n", " return qftcirc\n", "\n", "\n", @@ -274,19 +276,19 @@ " \"\"\"\n", " Construct a circuit object corresponding to the Quantum Fourier Transform (QFT)\n", " algorithm, applied to the argument qubits.\n", - " \n", + "\n", " Args:\n", " qubits (int): The list of qubits on which to apply the QFT\n", " \"\"\"\n", " qftcirc = Circuit()\n", - " \n", + "\n", " # First add the QFT subroutine above\n", " qftcirc.add(qft_no_swap(qubits))\n", - " \n", + "\n", " # Then add SWAP gates to reverse the order of the qubits:\n", - " for i in range(math.floor(len(qubits)/2)):\n", - " qftcirc.swap(qubits[i], qubits[-i-1])\n", - " \n", + " for i in range(math.floor(len(qubits) / 2)):\n", + " qftcirc.swap(qubits[i], qubits[-i - 1])\n", + "\n", " return qftcirc" ] }, @@ -309,33 +311,33 @@ "outputs": [], "source": [ "@circuit.subroutine(register=True)\n", - "def qft(qubits): \n", + "def qft(qubits):\n", " \"\"\"\n", " Construct a circuit object corresponding to the Quantum Fourier Transform (QFT)\n", " algorithm, applied to the argument qubits. Does not use recursion to generate the QFT.\n", - " \n", + "\n", " Args:\n", " qubits (int): The list of qubits on which to apply the QFT\n", " \"\"\"\n", " qftcirc = Circuit()\n", - " \n", + "\n", " # get number of qubits\n", " num_qubits = len(qubits)\n", - " \n", + "\n", " for k in range(num_qubits):\n", " # First add a Hadamard gate\n", " qftcirc.h(qubits[k])\n", - " \n", + "\n", " # Then apply the controlled rotations, with weights (angles) defined by the distance to the control qubit.\n", " # Start on the qubit after qubit k, and iterate until the end. When num_qubits==1, this loop does not run.\n", - " for j in range(1,num_qubits - k):\n", - " angle = 2*math.pi/(2**(j+1))\n", - " qftcirc.cphaseshift(qubits[k+j],qubits[k], angle)\n", - " \n", + " for j in range(1, num_qubits - k):\n", + " angle = 2 * math.pi / (2 ** (j + 1))\n", + " qftcirc.cphaseshift(qubits[k + j], qubits[k], angle)\n", + "\n", " # Then add SWAP gates to reverse the order of the qubits:\n", - " for i in range(math.floor(num_qubits/2)):\n", - " qftcirc.swap(qubits[i], qubits[-i-1])\n", - " \n", + " for i in range(math.floor(num_qubits / 2)):\n", + " qftcirc.swap(qubits[i], qubits[-i - 1])\n", + "\n", " return qftcirc" ] }, @@ -362,34 +364,33 @@ " \"\"\"\n", " Construct a circuit object corresponding to the inverse Quantum Fourier Transform (QFT)\n", " algorithm, applied to the argument qubits. Does not use recursion to generate the circuit.\n", - " \n", + "\n", " Args:\n", " qubits (int): The list of qubits on which to apply the inverse QFT\n", " \"\"\"\n", " # instantiate circuit object\n", " qftcirc = Circuit()\n", - " \n", + "\n", " # get number of qubits\n", " num_qubits = len(qubits)\n", - " \n", + "\n", " # First add SWAP gates to reverse the order of the qubits:\n", - " for i in range(math.floor(num_qubits/2)):\n", - " qftcirc.swap(qubits[i], qubits[-i-1])\n", - " \n", + " for i in range(math.floor(num_qubits / 2)):\n", + " qftcirc.swap(qubits[i], qubits[-i - 1])\n", + "\n", " # Start on the last qubit and work to the first.\n", " for k in reversed(range(num_qubits)):\n", - " \n", " # Apply the controlled rotations, with weights (angles) defined by the distance to the control qubit.\n", " # These angles are the negative of the angle used in the QFT.\n", - " # Start on the last qubit and iterate until the qubit after k. \n", + " # Start on the last qubit and iterate until the qubit after k.\n", " # When num_qubits==1, this loop does not run.\n", " for j in reversed(range(1, num_qubits - k)):\n", - " angle = -2*math.pi/(2**(j+1))\n", - " qftcirc.cphaseshift(qubits[k+j],qubits[k], angle)\n", - " \n", + " angle = -2 * math.pi / (2 ** (j + 1))\n", + " qftcirc.cphaseshift(qubits[k + j], qubits[k], angle)\n", + "\n", " # Then add a Hadamard gate\n", " qftcirc.h(qubits[k])\n", - " \n", + "\n", " return qftcirc" ] }, @@ -452,14 +453,14 @@ "source": [ "# show inverse QFT example circuit\n", "num_qubits = 2\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "my_qft_circ = qft(qubits)\n", - "print('QFT CIRCUIT:')\n", + "print(\"QFT CIRCUIT:\")\n", "print(my_qft_circ)\n", "\n", "# show inverse QFT example circuit\n", - "print('')\n", - "print('INVERSE-QFT CIRCUIT:')\n", + "print(\"\")\n", + "print(\"INVERSE-QFT CIRCUIT:\")\n", "my_iqft_circ = inverse_qft(qubits)\n", "print(my_iqft_circ)" ] @@ -512,14 +513,14 @@ "source": [ "# show inverse QFT example circuit\n", "num_qubits = 3\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "my_qft_circ = qft(qubits)\n", - "print('QFT CIRCUIT:')\n", + "print(\"QFT CIRCUIT:\")\n", "print(my_qft_circ)\n", "\n", "# show inverse QFT example circuit\n", - "print('')\n", - "print('INVERSE-QFT CIRCUIT:')\n", + "print(\"\")\n", + "print(\"INVERSE-QFT CIRCUIT:\")\n", "my_iqft_circ = inverse_qft(qubits)\n", "print(my_iqft_circ)" ] @@ -598,7 +599,7 @@ "source": [ "# check output for input |0,0,0> -> expect uniform distribution\n", "num_qubits = 3\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "my_qft_circ = qft(qubits)\n", "\n", "# specify desired results_types\n", @@ -613,19 +614,19 @@ "\n", "# format statevector for output\n", "state_vec_pretty = np.round(state_vector, decimals=3)\n", - "state_vec_pretty = [ampl if np.abs(ampl)>10**(-5) else 0 for ampl in state_vec_pretty]\n", + "state_vec_pretty = [ampl if np.abs(ampl) > 10 ** (-5) else 0 for ampl in state_vec_pretty]\n", "\n", "# bitstrings\n", - "format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + "format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", "bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", "# Print the output state vector\n", - "print('Exact statevector:\\n', state_vec_pretty)\n", + "print(\"Exact statevector:\\n\", state_vec_pretty)\n", "\n", "# plot probabalities\n", - "plt.bar(bitstring_keys, probs_values);\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('probability');" + "plt.bar(bitstring_keys, probs_values)\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"probability\");" ] }, { @@ -688,23 +689,23 @@ } ], "source": [ - "# prepare initial state \n", + "# prepare initial state\n", "num_qubits = 3\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "circ = Circuit()\n", "circ.h(qubits)\n", "for ii in range(num_qubits - 1):\n", - " circ.rz(ii+1, math.pi/(2**ii))\n", + " circ.rz(ii + 1, math.pi / (2**ii))\n", "\n", - "print('1. Printing circuit for state preparation:')\n", + "print(\"1. Printing circuit for state preparation:\")\n", "print(circ)\n", "\n", "# add QFT circuit\n", "circ.inverse_qft(qubits)\n", "\n", "# print circuit including QFT\n", - "print('')\n", - "print('2. Full circuit including inverse QFT:')\n", + "print(\"\")\n", + "print(\"2. Full circuit including inverse QFT:\")\n", "print(circ)" ] }, @@ -750,19 +751,19 @@ "\n", "# format statevector for output\n", "state_vec_pretty = np.round(state_vector, decimals=3)\n", - "state_vec_pretty = [ampl if np.abs(ampl)>10**(-5) else 0 for ampl in state_vec_pretty]\n", + "state_vec_pretty = [ampl if np.abs(ampl) > 10 ** (-5) else 0 for ampl in state_vec_pretty]\n", "\n", "# bitstrings\n", - "format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + "format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", "bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", "# Print the output state vector\n", - "print('Exact statevector:\\n', state_vec_pretty)\n", + "print(\"Exact statevector:\\n\", state_vec_pretty)\n", "\n", "# plot probabalities\n", - "plt.bar(bitstring_keys, probs_values);\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('probability');\n", + "plt.bar(bitstring_keys, probs_values)\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"probability\")\n", "plt.xticks(rotation=90);" ] }, @@ -829,23 +830,23 @@ } ], "source": [ - "# prepare initial state \n", + "# prepare initial state\n", "num_qubits = 4\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "circ = Circuit()\n", "circ.h(qubits)\n", "for ii in range(num_qubits - 1):\n", - " circ.rz(ii+1, math.pi/(2**ii))\n", + " circ.rz(ii + 1, math.pi / (2**ii))\n", "\n", - "print('1. Printing circuit for state preparation:')\n", + "print(\"1. Printing circuit for state preparation:\")\n", "print(circ)\n", "\n", - "# add QFT circuit \n", + "# add QFT circuit\n", "circ.inverse_qft(qubits)\n", "\n", "# print circuit including QFT\n", - "print('')\n", - "print('2. Full circuit including inverse QFT:')\n", + "print(\"\")\n", + "print(\"2. Full circuit including inverse QFT:\")\n", "print(circ)\n", "\n", "# specify desired results_types\n", @@ -860,19 +861,19 @@ "\n", "# format statevector for output\n", "state_vec_pretty = np.round(state_vector, decimals=3)\n", - "state_vec_pretty = [ampl if np.abs(ampl)>10**(-5) else 0 for ampl in state_vec_pretty]\n", + "state_vec_pretty = [ampl if np.abs(ampl) > 10 ** (-5) else 0 for ampl in state_vec_pretty]\n", "\n", "# bitstrings\n", - "format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + "format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", "bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", "# Print the output state vector\n", - "print('Exact statevector:\\n', state_vec_pretty)\n", + "print(\"Exact statevector:\\n\", state_vec_pretty)\n", "\n", "# plot probabalities\n", - "plt.bar(bitstring_keys, probs_values);\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('probability');\n", + "plt.bar(bitstring_keys, probs_values)\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"probability\")\n", "plt.xticks(rotation=90);" ] }, @@ -920,9 +921,9 @@ } ], "source": [ - "# prepare initial state \n", + "# prepare initial state\n", "num_qubits = 3\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "circ = Circuit()\n", "\n", "# add QFT circuit\n", @@ -941,19 +942,19 @@ "\n", "# format statevector for output\n", "state_vec_pretty = np.round(state_vector, decimals=3)\n", - "state_vec_pretty = [ampl if np.abs(ampl)>10**(-5) else 0 for ampl in state_vec_pretty]\n", + "state_vec_pretty = [ampl if np.abs(ampl) > 10 ** (-5) else 0 for ampl in state_vec_pretty]\n", "\n", "# bitstrings\n", - "format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + "format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", "bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", "# Print the output state vector\n", - "print('Exact statevector:\\n', state_vec_pretty)\n", + "print(\"Exact statevector:\\n\", state_vec_pretty)\n", "\n", "# plot probabalities\n", - "plt.bar(bitstring_keys, probs_values);\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('probability');\n", + "plt.bar(bitstring_keys, probs_values)\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"probability\")\n", "plt.xticks(rotation=90);" ] }, @@ -987,15 +988,15 @@ } ], "source": [ - "# prepare initial state \n", + "# prepare initial state\n", "num_qubits = 3\n", - "qubits=range(num_qubits)\n", + "qubits = range(num_qubits)\n", "circ = Circuit()\n", "circ.x(0)\n", "circ.x(2)\n", "\n", "# add QFT circuit\n", - " \n", + "\n", "circ.qft(qubits)\n", "circ.inverse_qft(qubits)\n", "\n", @@ -1011,19 +1012,19 @@ "\n", "# format statevector for output\n", "state_vec_pretty = np.round(state_vector, decimals=3)\n", - "state_vec_pretty = [ampl if np.abs(ampl)>10**(-5) else 0 for ampl in state_vec_pretty]\n", + "state_vec_pretty = [ampl if np.abs(ampl) > 10 ** (-5) else 0 for ampl in state_vec_pretty]\n", "\n", "# bitstrings\n", - "format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + "format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", "bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", "# Print the output state vector\n", - "print('Exact statevector:\\n', state_vec_pretty)\n", + "print(\"Exact statevector:\\n\", state_vec_pretty)\n", "\n", "# plot probabalities\n", - "plt.bar(bitstring_keys, probs_values);\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('probability');\n", + "plt.bar(bitstring_keys, probs_values)\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"probability\")\n", "plt.xticks(rotation=90);" ] }, @@ -1099,16 +1100,16 @@ ], "source": [ "# set qubits to perform (inverse) QFT on\n", - "qubits = [1,3,6,7]\n", + "qubits = [1, 3, 6, 7]\n", "\n", - "# print circuits \n", - "print('Circuit for QFT (using non-recursive implementation):')\n", + "# print circuits\n", + "print(\"Circuit for QFT (using non-recursive implementation):\")\n", "print(qft(qubits))\n", - "print('')\n", - "print('Circuit for QFT (using recursive implementation):')\n", + "print(\"\")\n", + "print(\"Circuit for QFT (using recursive implementation):\")\n", "print(qft_recursive(qubits))\n", - "print('')\n", - "print('Circuit for inverse QFT:')\n", + "print(\"\")\n", + "print(\"Circuit for inverse QFT:\")\n", "print(inverse_qft(qubits))" ] }, diff --git a/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/Quantum_Phase_Estimation.ipynb b/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/Quantum_Phase_Estimation.ipynb index 94089e045..95f5dfac9 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/Quantum_Phase_Estimation.ipynb +++ b/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/Quantum_Phase_Estimation.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -195,8 +196,9 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline" ] @@ -214,8 +216,7 @@ "source": [ "# AWS imports: Import Amazon Braket SDK modules\n", "from braket.circuits import Circuit\n", - "from braket.devices import Devices, LocalSimulator\n", - "from braket.aws import AwsDevice" + "from braket.devices import LocalSimulator" ] }, { @@ -281,13 +282,10 @@ "outputs": [], "source": [ "# Define Pauli matrices\n", - "Id = np.eye(2) # Identity matrix\n", - "X = np.array([[0., 1.],\n", - " [1., 0.]]) # Pauli X\n", - "Y = np.array([[0., -1.j],\n", - " [1.j, 0.]]) # Pauli Y\n", - "Z = np.array([[1., 0.],\n", - " [0., -1.]]) # Pauli Z" + "Id = np.eye(2) # Identity matrix\n", + "X = np.array([[0.0, 1.0], [1.0, 0.0]]) # Pauli X\n", + "Y = np.array([[0.0, -1.0j], [1.0j, 0.0]]) # Pauli Y\n", + "Z = np.array([[1.0, 0.0], [0.0, -1.0]]) # Pauli Z" ] }, { @@ -363,7 +361,7 @@ "\n", "# show small QPE example circuit\n", "my_qpe_circ = my_qpe_circ.qpe(precision_qubits, query_qubits, unitary)\n", - "print('QPE CIRCUIT:')\n", + "print(\"QPE CIRCUIT:\")\n", "print(my_qpe_circ)" ] }, @@ -423,7 +421,7 @@ "\n", "# show small QPE example circuit\n", "my_qpe_circ = my_qpe_circ.qpe(precision_qubits, query_qubits, unitary)\n", - "print('QPE CIRCUIT:')\n", + "print(\"QPE CIRCUIT:\")\n", "print(my_qpe_circ)" ] }, @@ -484,7 +482,7 @@ "\n", "# show small QPE example circuit\n", "my_qpe_circ = my_qpe_circ.qpe(precision_qubits, query_qubits, unitary, control_unitary=False)\n", - "print('QPE CIRCUIT:')\n", + "print(\"QPE CIRCUIT:\")\n", "print(my_qpe_circ)" ] }, @@ -543,33 +541,32 @@ " Args:\n", " out: dictionary containing results/information associated with QPE run as produced by run_qpe\n", " \"\"\"\n", - " \n", + "\n", " # unpack results\n", - " circ = out['circuit']\n", - " measurement_counts = out['measurement_counts']\n", - " bitstring_keys = out['bitstring_keys']\n", - " probs_values = out['probs_values']\n", - " precision_results_dic = out['precision_results_dic']\n", - " phases_decimal = out['phases_decimal']\n", - " eigenvalues = out['eigenvalues']\n", - " \n", - " # print the circuit \n", - " print('Printing circuit:')\n", + " circ = out[\"circuit\"]\n", + " measurement_counts = out[\"measurement_counts\"]\n", + " bitstring_keys = out[\"bitstring_keys\"]\n", + " probs_values = out[\"probs_values\"]\n", + " precision_results_dic = out[\"precision_results_dic\"]\n", + " phases_decimal = out[\"phases_decimal\"]\n", + " eigenvalues = out[\"eigenvalues\"]\n", + "\n", + " # print the circuit\n", + " print(\"Printing circuit:\")\n", " print(circ)\n", - " \n", + "\n", " # print measurement results\n", - " print('Measurement counts:', measurement_counts)\n", - " \n", - " # plot probabalities\n", - " plt.bar(bitstring_keys, probs_values);\n", - " plt.xlabel('bitstrings');\n", - " plt.ylabel('probability');\n", - " plt.xticks(rotation=90);\n", + " print(\"Measurement counts:\", measurement_counts)\n", "\n", + " # plot probabalities\n", + " plt.bar(bitstring_keys, probs_values)\n", + " plt.xlabel(\"bitstrings\")\n", + " plt.ylabel(\"probability\")\n", + " plt.xticks(rotation=90)\n", " # print results\n", - " print('Results in precision register:', precision_results_dic)\n", - " print('QPE phase estimates:', phases_decimal)\n", - " print('QPE eigenvalue estimates:', np.round(eigenvalues, 5))" + " print(\"Results in precision register:\", precision_results_dic)\n", + " print(\"QPE phase estimates:\", phases_decimal)\n", + " print(\"QPE eigenvalue estimates:\", np.round(eigenvalues, 5))" ] }, { @@ -910,14 +907,14 @@ ], "source": [ "# set unitary matrix U\n", - "u1 = np.kron(X, Id) \n", + "u1 = np.kron(X, Id)\n", "u2 = np.kron(Id, Z)\n", "unitary = np.dot(u1, u2)\n", - "print('Two-qubit unitary (XZ):\\n', unitary)\n", + "print(\"Two-qubit unitary (XZ):\\n\", unitary)\n", "\n", - "# get example eigensystem \n", + "# get example eigensystem\n", "eig_values, eig_vectors = np.linalg.eig(unitary)\n", - "print('Eigenvalues:', eig_values)\n", + "print(\"Eigenvalues:\", eig_values)\n", "# print('Eigenvectors:', eig_vectors)" ] }, @@ -972,7 +969,7 @@ "precision_qubits = range(number_precision_qubits)\n", "\n", "# Define the query qubits. We'll have them start after the precision qubits\n", - "query_qubits = [number_precision_qubits, number_precision_qubits+1]\n", + "query_qubits = [number_precision_qubits, number_precision_qubits + 1]\n", "\n", "# State preparation for eigenstate |+,1> of U=X \\otimes Z\n", "query = Circuit().h(query_qubits[0]).x(query_qubits[1])\n", @@ -1041,11 +1038,11 @@ "unitary = np.diag(evals)\n", "\n", "# Check that this is indeed unitary, and print it out:\n", - "print('Two-qubit random unitary:\\n', np.round(unitary, 3))\n", - "print('Check for unitarity: ', np.allclose(np.eye(len(unitary)), unitary.dot(unitary.T.conj())))\n", + "print(\"Two-qubit random unitary:\\n\", np.round(unitary, 3))\n", + "print(\"Check for unitarity: \", np.allclose(np.eye(len(unitary)), unitary.dot(unitary.T.conj())))\n", "\n", "# Print eigenvalues\n", - "print('Eigenvalues:', np.round(evals, 3))" + "print(\"Eigenvalues:\", np.round(evals, 3))" ] }, { @@ -1075,7 +1072,7 @@ } ], "source": [ - "print('Target eigenvalue:', np.round(evals[-1], 3))" + "print(\"Target eigenvalue:\", np.round(evals[-1], 3))" ] }, { @@ -1132,7 +1129,7 @@ "precision_qubits = range(number_precision_qubits)\n", "\n", "# Define the query qubits. We'll have them start after the precision qubits\n", - "query_qubits = [number_precision_qubits, number_precision_qubits+1]\n", + "query_qubits = [number_precision_qubits, number_precision_qubits + 1]\n", "\n", "# State preparation for eigenstate |1,1> of diagonal U\n", "query = Circuit().x(query_qubits[0]).x(query_qubits[1])\n", @@ -1144,7 +1141,7 @@ "postprocess_qpe_results(out)\n", "\n", "# compare output to exact target values\n", - "print('Target eigenvalue:', np.round(evals[-1], 3))" + "print(\"Target eigenvalue:\", np.round(evals[-1], 3))" ] }, { @@ -1181,7 +1178,7 @@ "precision_qubits = range(number_precision_qubits)\n", "\n", "# Define the query qubits. We'll have them start after the precision qubits\n", - "query_qubits = [number_precision_qubits, number_precision_qubits+1]\n", + "query_qubits = [number_precision_qubits, number_precision_qubits + 1]\n", "\n", "# State preparation for eigenstate |1,1> of diagonal U\n", "query = Circuit().x(query_qubits[0]).x(query_qubits[1])\n", @@ -1190,11 +1187,11 @@ "out = run_qpe(unitary, precision_qubits, query_qubits, query, device)\n", "\n", "# Postprocess results\n", - "eigenvalues = out['eigenvalues']\n", - "print('QPE eigenvalue estimates:', np.round(eigenvalues, 5))\n", + "eigenvalues = out[\"eigenvalues\"]\n", + "print(\"QPE eigenvalue estimates:\", np.round(eigenvalues, 5))\n", "\n", "# compare output to exact target values\n", - "print('Target eigenvalue:', np.round(evals[-1], 5))" + "print(\"Target eigenvalue:\", np.round(evals[-1], 5))" ] }, { @@ -1580,8 +1577,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] } ], diff --git a/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qft.py b/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qft.py index 73fe0a74a..b400c5661 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qft.py +++ b/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qft.py @@ -111,7 +111,6 @@ def inverse_qft(qubits): # Start on the last qubit and work to the first. for k in reversed(range(num_qubits)): - # Apply the controlled rotations, with weights (angles) defined by the distance to the control qubit. # These angles are the negative of the angle used in the QFT. # Start on the last qubit and iterate until the qubit after k. diff --git a/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qpe.py b/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qpe.py index 2393b3601..1cf3a619b 100644 --- a/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qpe.py +++ b/examples/advanced_circuits_algorithms/Quantum_Phase_Estimation/utils_qpe.py @@ -5,12 +5,12 @@ import numpy as np +# local imports +from utils_qft import inverse_qft # noqa: F401 + # AWS imports: Import Braket SDK modules from braket.circuits import Circuit, circuit -# local imports -from utils_qft import inverse_qft - @circuit.subroutine(register=True) def controlled_unitary(control, target_qubits, unitary): @@ -65,10 +65,6 @@ def qpe(precision_qubits, query_qubits, unitary, control_unitary=True): """ qpe_circ = Circuit() - # Get number of qubits - num_precision_qubits = len(precision_qubits) - num_query_qubits = len(query_qubits) - # Apply Hadamard across precision register qpe_circ.h(precision_qubits) @@ -80,13 +76,13 @@ def qpe(precision_qubits, query_qubits, unitary, control_unitary=True): # Alterantive 1: Implement C-(U^{2^k}) if control_unitary: # Define the matrix U^{2^k} - Uexp = np.linalg.matrix_power(unitary, 2 ** power) + Uexp = np.linalg.matrix_power(unitary, 2**power) # Apply the controlled unitary C-(U^{2^k}) qpe_circ.controlled_unitary(qubit, query_qubits, Uexp) # Alterantive 2: One can instead apply controlled-unitary (2**power) times to get C-U^{2^power} else: - for _ in range(2 ** power): + for _ in range(2**power): qpe_circ.controlled_unitary(qubit, query_qubits, unitary) # Apply inverse qft to the precision_qubits @@ -224,7 +220,7 @@ def run_qpe( """ # get size of precision register and total number of qubits - number_precision_qubits = len(precision_qubits) + len(precision_qubits) num_qubits = len(precision_qubits) + len(query_qubits) # Define the circuit. Start by copying the query_circuit, then add the QPE: @@ -255,7 +251,7 @@ def run_qpe( # bitstrings format_bitstring = "{0:0" + str(num_qubits) + "b}" - bitstring_keys = [format_bitstring.format(ii) for ii in range(2 ** num_qubits)] + bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)] # QPE postprocessing phases_decimal, precision_results_dic = get_qpe_phases( diff --git a/examples/advanced_circuits_algorithms/Randomness/Randomness_Generation.ipynb b/examples/advanced_circuits_algorithms/Randomness/Randomness_Generation.ipynb index 043f3a2ff..6c876ba10 100644 --- a/examples/advanced_circuits_algorithms/Randomness/Randomness_Generation.ipynb +++ b/examples/advanced_circuits_algorithms/Randomness/Randomness_Generation.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -73,23 +74,22 @@ "outputs": [], "source": [ "# AWS imports: Import Braket SDK modules\n", + "import math\n", + "\n", + "# import convex solver\n", + "import cvxpy as cp # general math imports\n", + "import numpy as np\n", + "from scipy.fft import fft, ifft\n", + "\n", + "from braket.aws import AwsDevice, AwsQuantumTask\n", "from braket.circuits import Circuit\n", "from braket.devices import Devices, LocalSimulator\n", - "from braket.aws import AwsDevice, AwsQuantumTask\n", "\n", "# set up local simulator device\n", "device = LocalSimulator()\n", "\n", - "# general math imports\n", - "import math\n", - "import numpy as np\n", - "from scipy.fft import fft, ifft\n", - "\n", "# magic word for producing visualizations in notebook\n", - "%matplotlib inline\n", - "\n", - "# import convex solver\n", - "import cvxpy as cp" + "%matplotlib inline" ] }, { @@ -187,6 +187,7 @@ "\n", " return circuit\n", "\n", + "\n", "# define circuit\n", "n_qubits = 5\n", "state = hadamard_circuit(n_qubits)\n", @@ -225,7 +226,7 @@ "source": [ "# run circuit\n", "m_shots = 1\n", - "result = device.run(state, shots = m_shots).result()\n", + "result = device.run(state, shots=m_shots).result()\n", "\n", "# get measurement shots\n", "counts = result.measurement_counts.keys()\n", @@ -233,7 +234,7 @@ "# print counts\n", "list_one = list(counts)[0]\n", "array_one = np.array([list_one])\n", - "print(\"The output bit string is: \",array_one)" + "print(\"The output bit string is: \", array_one)" ] }, { @@ -353,10 +354,10 @@ "\n", "# set security parameter\n", "power = 8\n", - "eps = 10**(-power)\n", + "eps = 10 ** (-power)\n", "print(f\"Security parameter: {eps}.\")\n", "\n", - "# set number of output bits \n", + "# set number of output bits\n", "m = 10\n", "print(f\"Desired output length: {m} bits.\")\n", "\n", @@ -367,8 +368,7 @@ "print(f\"Min-entropy rate of second source: {k_2}\")\n", "\n", "# required number of input bits (for each source)\n", - "n = math.floor((m-1-2*math.log2(eps))\n", - " /(k_1+k_2-1))\n", + "n = math.floor((m - 1 - 2 * math.log2(eps)) / (k_1 + k_2 - 1))\n", "print(f\"Required length of each input source: {n} bits.\")\n", "\n", "# quantum circuit for generating weakly random bit string one\n", @@ -376,7 +376,7 @@ "m1_shots = n\n", "state1 = hadamard_circuit(n1_qubits)\n", "result1 = device.run(state1, shots=m1_shots).result()\n", - "array_one = result1.measurements.reshape(1,m1_shots*n1_qubits)\n", + "array_one = result1.measurements.reshape(1, m1_shots * n1_qubits)\n", "# print(array_one)\n", "\n", "# quantum circuit for generating weakly random bit string two\n", @@ -384,7 +384,7 @@ "m2_shots = n\n", "state2 = hadamard_circuit(n2_qubits)\n", "result2 = device.run(state2, shots=m2_shots).result()\n", - "array_two = result2.measurements.reshape(1,m2_shots*n2_qubits)\n", + "array_two = result2.measurements.reshape(1, m2_shots * n2_qubits)\n", "# print(array_two)\n", "\n", "###\n", @@ -410,19 +410,19 @@ "# via efficient Fast Fourier Transform (FFT) as discussed in [1]\n", "\n", "# setting up arrays for FFT implementation of Toeplitz\n", - "array_two_under = np.array(array_two[0,0:n-m])[np.newaxis]\n", - "zero_vector = np.zeros((1,n+m-3), dtype=int)\n", - "array_two_zeros = np.hstack((array_two_under,zero_vector))\n", - "array_two_over = array_two[0,n-m:n][np.newaxis]\n", - "array_one_merged = np.zeros((1,2*n-3), dtype=int)\n", + "array_two_under = np.array(array_two[0, 0 : n - m])[np.newaxis]\n", + "zero_vector = np.zeros((1, n + m - 3), dtype=int)\n", + "array_two_zeros = np.hstack((array_two_under, zero_vector))\n", + "array_two_over = array_two[0, n - m : n][np.newaxis]\n", + "array_one_merged = np.zeros((1, 2 * n - 3), dtype=int)\n", "for i in range(m):\n", - " array_one_merged[0,i] = array_one[0,m-1-i]\n", - "for j in range(n-m-1):\n", - " array_one_merged[0,n+m-2+j] = array_one[0,n-2-j]\n", + " array_one_merged[0, i] = array_one[0, m - 1 - i]\n", + "for j in range(n - m - 1):\n", + " array_one_merged[0, n + m - 2 + j] = array_one[0, n - 2 - j]\n", "\n", "# FFT multplication output of Toeplitz\n", - "output_fft = np.around(ifft(fft(array_one_merged)*fft(array_two_zeros)).real)\n", - "output_addition = output_fft[0,0:m] + array_two_over\n", + "output_fft = np.around(ifft(fft(array_one_merged) * fft(array_two_zeros)).real)\n", + "output_addition = output_fft[0, 0:m] + array_two_over\n", "output_final = output_addition.astype(int) % 2\n", "print(f\"The {m} random output bits are:\\n{output_final}.\")" ] @@ -577,51 +577,56 @@ "mu = 0.98\n", "\n", "# purification of rho input state\n", - "rho = 0.5*np.array([[1,1-lamb],[1-lamb,1]])\n", + "rho = 0.5 * np.array([[1, 1 - lamb], [1 - lamb, 1]])\n", "eigvals, eigvecs = np.linalg.eig(rho)\n", "\n", - "rho_vector =\\\n", - " math.sqrt(eigvals[0])*np.kron(eigvecs[:,0],eigvecs[:,0])[np.newaxis]\\\n", - " +math.sqrt(eigvals[1])*np.kron(eigvecs[:,1],eigvecs[:,1])[np.newaxis]\n", - "rho_pure = np.kron(rho_vector,rho_vector.T)\n", + "rho_vector = (\n", + " math.sqrt(eigvals[0]) * np.kron(eigvecs[:, 0], eigvecs[:, 0])[np.newaxis]\n", + " + math.sqrt(eigvals[1]) * np.kron(eigvecs[:, 1], eigvecs[:, 1])[np.newaxis]\n", + ")\n", + "rho_pure = np.kron(rho_vector, rho_vector.T)\n", "\n", "# sigma state of noisy measurement device\n", - "sigma_vector = np.array([[math.sqrt(1-mu),0,0,math.sqrt(mu)]])\n", - "sigma_pure = np.kron(sigma_vector,sigma_vector.T)\n", + "sigma_vector = np.array([[math.sqrt(1 - mu), 0, 0, math.sqrt(mu)]])\n", + "sigma_pure = np.kron(sigma_vector, sigma_vector.T)\n", "\n", "# omega state relevant for conditional min-entropy\n", - "rho_sigma = np.kron(rho_pure,sigma_pure)\n", + "rho_sigma = np.kron(rho_pure, sigma_pure)\n", "\n", "id_2 = np.identity(2)\n", - "zero = np.array([[1,0]])\n", - "one = np.array([[0,1]])\n", + "zero = np.array([[1, 0]])\n", + "one = np.array([[0, 1]])\n", "\n", - "zerozero = np.kron(np.kron(zero,id_2),np.kron(zero,id_2))\n", - "zeroone = np.kron(np.kron(zero,id_2),np.kron(one,id_2))\n", - "onezero = np.kron(np.kron(one,id_2),np.kron(zero,id_2))\n", - "oneone = np.kron(np.kron(one,id_2),np.kron(one,id_2))\n", + "zerozero = np.kron(np.kron(zero, id_2), np.kron(zero, id_2))\n", + "zeroone = np.kron(np.kron(zero, id_2), np.kron(one, id_2))\n", + "onezero = np.kron(np.kron(one, id_2), np.kron(zero, id_2))\n", + "oneone = np.kron(np.kron(one, id_2), np.kron(one, id_2))\n", "\n", - "omega_0 = zerozero@rho_sigma@zerozero.T+zeroone@rho_sigma@zeroone.T+onezero@rho_sigma@onezero.T\n", - "omega_1 = oneone@rho_sigma@oneone.T\n", + "omega_0 = (\n", + " zerozero @ rho_sigma @ zerozero.T\n", + " + zeroone @ rho_sigma @ zeroone.T\n", + " + onezero @ rho_sigma @ onezero.T\n", + ")\n", + "omega_1 = oneone @ rho_sigma @ oneone.T\n", "\n", "omega = []\n", "omega.append(omega_0)\n", "omega.append(omega_1)\n", "\n", "# sdp solver\n", - "m = 4 # dimension of quantum side information states\n", - "c = 2 # number of classical measurement outcomes\n", + "m = 4 # dimension of quantum side information states\n", + "c = 2 # number of classical measurement outcomes\n", "\n", - "sigma = cp.Variable((m,m), complex=True) # complex variable\n", - "constraints = [sigma >> 0] # positive semi-definite\n", - "constraints += [sigma >> omega[i] for i in range(c)] # min-entropy constraints\n", - "obj = cp.Minimize(cp.real(cp.trace(sigma))) # objective function\n", + "sigma = cp.Variable((m, m), complex=True) # complex variable\n", + "constraints = [sigma >> 0] # positive semi-definite\n", + "constraints += [sigma >> omega[i] for i in range(c)] # min-entropy constraints\n", + "obj = cp.Minimize(cp.real(cp.trace(sigma))) # objective function\n", "\n", - "prob = cp.Problem(obj,constraints) # set up sdp problem\n", - "prob.solve(solver=cp.SCS, verbose=True) # solve sdp problem using splitting conic solver (SCS)\n", + "prob = cp.Problem(obj, constraints) # set up sdp problem\n", + "prob.solve(solver=cp.SCS, verbose=True) # solve sdp problem using splitting conic solver (SCS)\n", "guess = prob.value\n", - "qmin_entropy = (-1)*math.log2(guess)\n", - "min_entropy = 1-math.log2(2-mu*(1-lamb))\n", + "qmin_entropy = (-1) * math.log2(guess)\n", + "min_entropy = 1 - math.log2(2 - mu * (1 - lamb))\n", "\n", "print(\"\\033[1m\" + \"The coditional min-entropy is: \", qmin_entropy)\n", "print(\"As a comparison, the unconditional min-entropy is: \", min_entropy)" @@ -678,10 +683,10 @@ "source": [ "# set security parameter\n", "power = 8\n", - "eps = 10**(-power)\n", + "eps = 10 ** (-power)\n", "print(f\"Security parameter: {eps}.\")\n", "\n", - "# set number of output bits \n", + "# set number of output bits\n", "m = 10\n", "print(f\"Desired output length: {m} bits.\")\n", "\n", @@ -692,8 +697,7 @@ "print(f\"Min-entropy rate of second source: {k_2}.\")\n", "\n", "# required number of input bits (for each source)\n", - "n = math.floor((m-1-2*math.log2(eps))\n", - " /(k_one+k_two-1))\n", + "n = math.floor((m - 1 - 2 * math.log2(eps)) / (k_one + k_two - 1))\n", "print(f\"Required length of each input source: {n} bits.\")" ] }, @@ -727,20 +731,24 @@ ], "source": [ "# Rigetti: quantum circuit for generating weakly random bit string one\n", - "n1_q = 1 # alternatively use more than one qubit (attention: 32 max + lower bounds on number of shots)\n", - "m1_s = int(math.ceil(n/n1_q))\n", + "n1_q = (\n", + " 1 # alternatively use more than one qubit (attention: 32 max + lower bounds on number of shots)\n", + ")\n", + "m1_s = int(math.ceil(n / n1_q))\n", "state_rigetti = hadamard_circuit(n1_q)\n", - "rigetti_task = rigetti.run(state_rigetti, shots=m1_s, poll_timeout_seconds=5*24*60*60)\n", + "rigetti_task = rigetti.run(state_rigetti, shots=m1_s, poll_timeout_seconds=5 * 24 * 60 * 60)\n", "\n", "rigetti_task_id = rigetti_task.id\n", "rigetti_status = rigetti_task.state()\n", "print(\"Status of Rigetti task:\", rigetti_status)\n", "\n", "# IonQ: quantum circuit for generating weakly random bit string two\n", - "n2_q = 1 # alternatively use more than one qubit (attention: 11 max + lower bounds on number of shots)\n", - "m2_s = int(math.ceil(n/n2_q))\n", + "n2_q = (\n", + " 1 # alternatively use more than one qubit (attention: 11 max + lower bounds on number of shots)\n", + ")\n", + "m2_s = int(math.ceil(n / n2_q))\n", "state_ionq = hadamard_circuit(n2_q)\n", - "ionq_task = ionq.run(state_ionq, shots=m2_s, poll_timeout_seconds=5*24*60*60)\n", + "ionq_task = ionq.run(state_ionq, shots=m2_s, poll_timeout_seconds=5 * 24 * 60 * 60)\n", "\n", "ionq_task_id = ionq_task.id\n", "ionq_status = ionq_task.state()\n", @@ -806,51 +814,53 @@ "\n", "# print status\n", "status_rigetti = task_load_rigetti.state()\n", - "print('Status of Rigetti task:', status_rigetti)\n", + "print(\"Status of Rigetti task:\", status_rigetti)\n", "# wait for hybrid job to complete\n", "# terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", - "if status_rigetti == 'COMPLETED':\n", + "if status_rigetti == \"COMPLETED\":\n", " # get results\n", " rigetti_results = task_load_rigetti.result()\n", - " \n", + "\n", " # array\n", - " array_rigetti = rigetti_results.measurements.reshape(1,m1_s*n1_q)\n", - " print(\"The first raw bit string is: \",array_rigetti)\n", - " \n", - "elif status_rigetti in ['FAILED', 'CANCELLED']:\n", - " # print terminal message \n", - " print('Your Rigetti quantum task is in terminal status, but has not completed.')\n", + " array_rigetti = rigetti_results.measurements.reshape(1, m1_s * n1_q)\n", + " print(\"The first raw bit string is: \", array_rigetti)\n", + "\n", + "elif status_rigetti in [\"FAILED\", \"CANCELLED\"]:\n", + " # print terminal message\n", + " print(\"Your Rigetti quantum task is in terminal status, but has not completed.\")\n", "\n", "else:\n", " # print current status\n", - " print('Sorry, your Rigetti quantum task is still being processed and has not been finalized yet.')\n", - " \n", + " print(\n", + " \"Sorry, your Rigetti quantum task is still being processed and has not been finalized yet.\"\n", + " )\n", + "\n", "# recover IonQ task\n", "task_load_ionq = AwsQuantumTask(arn=ionq_task_id)\n", "\n", "# print status\n", "status_ionq = task_load_ionq.state()\n", - "print('Status of IonQ quantum task:', status_ionq)\n", + "print(\"Status of IonQ quantum task:\", status_ionq)\n", "# wait for hybrid job to complete\n", "# terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", - "if status_ionq == 'COMPLETED':\n", + "if status_ionq == \"COMPLETED\":\n", " # get results\n", " ionq_results = task_load_ionq.result()\n", - " \n", + "\n", " # array\n", - " #print(m1_shots,n1_qubits)\n", - " #print(m2_shots,n2_qubits)\n", - " #print(ionq_results.measurements)\n", - " array_ionq = ionq_results.measurements.reshape(1,m2_s*n2_q)\n", - " print(\"The second raw bit string is: \",array_ionq)\n", - " \n", - "elif status_ionq in ['FAILED', 'CANCELLED']:\n", - " # print terminal message \n", - " print('Your IonQ quantum task is in terminal status, but has not completed.')\n", + " # print(m1_shots,n1_qubits)\n", + " # print(m2_shots,n2_qubits)\n", + " # print(ionq_results.measurements)\n", + " array_ionq = ionq_results.measurements.reshape(1, m2_s * n2_q)\n", + " print(\"The second raw bit string is: \", array_ionq)\n", + "\n", + "elif status_ionq in [\"FAILED\", \"CANCELLED\"]:\n", + " # print terminal message\n", + " print(\"Your IonQ quantum task is in terminal status, but has not completed.\")\n", "\n", "else:\n", " # print current status\n", - " print('Sorry, your IonQ quantum task is still being processed and has not been finalized yet.')" + " print(\"Sorry, your IonQ quantum task is still being processed and has not been finalized yet.\")" ] }, { @@ -880,26 +890,26 @@ ], "source": [ "# setting up arrays for fft implementation of Toeplitz\n", - "if status_ionq == 'COMPLETED':\n", - " array_two_under = np.array(array_ionq[0,0:n-m])[np.newaxis]\n", - " zero_vector = np.zeros((1,n+m-3), dtype=int)\n", - " array_two_zeros = np.hstack((array_two_under,zero_vector))\n", - " array_two_over = array_ionq[0,n-m:n][np.newaxis]\n", - " array_one_merged = np.zeros((1,2*n-3), dtype=int)\n", - " if status_rigetti == 'COMPLETED':\n", + "if status_ionq == \"COMPLETED\":\n", + " array_two_under = np.array(array_ionq[0, 0 : n - m])[np.newaxis]\n", + " zero_vector = np.zeros((1, n + m - 3), dtype=int)\n", + " array_two_zeros = np.hstack((array_two_under, zero_vector))\n", + " array_two_over = array_ionq[0, n - m : n][np.newaxis]\n", + " array_one_merged = np.zeros((1, 2 * n - 3), dtype=int)\n", + " if status_rigetti == \"COMPLETED\":\n", " for i in range(m):\n", - " array_one_merged[0,i] = array_rigetti[0,m-1-i]\n", - " for j in range(n-m-1):\n", - " array_one_merged[0,n+m-2+j] = array_rigetti[0,n-2-j]\n", + " array_one_merged[0, i] = array_rigetti[0, m - 1 - i]\n", + " for j in range(n - m - 1):\n", + " array_one_merged[0, n + m - 2 + j] = array_rigetti[0, n - 2 - j]\n", "\n", " # fft multplication output of Toeplitz\n", - " output_fft = np.around(ifft(fft(array_one_merged)*fft(array_two_zeros)).real)\n", - " output_addition = output_fft[0,0:m] + array_two_over\n", + " output_fft = np.around(ifft(fft(array_one_merged) * fft(array_two_zeros)).real)\n", + " output_addition = output_fft[0, 0:m] + array_two_over\n", " output_final = output_addition.astype(int) % 2\n", " print(f\"The {m} random output bits are:\\n{output_final}.\")\n", - " else: \n", + " else:\n", " print(f\"Your Rigetti quantum task is in {status_rigetti} state.\")\n", - "else: \n", + "else:\n", " print(f\"Your IonQ quantum task is in {status_ionq} state.\")" ] }, @@ -959,8 +969,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/advanced_circuits_algorithms/Simons_Algorithm/Simons_Algorithm.ipynb b/examples/advanced_circuits_algorithms/Simons_Algorithm/Simons_Algorithm.ipynb index ba5104239..668e60790 100644 --- a/examples/advanced_circuits_algorithms/Simons_Algorithm/Simons_Algorithm.ipynb +++ b/examples/advanced_circuits_algorithms/Simons_Algorithm/Simons_Algorithm.ipynb @@ -214,11 +214,12 @@ "outputs": [], "source": [ "# Imports and Setup\n", - "from braket.circuits import Circuit, circuit\n", - "from braket.devices import LocalSimulator\n", + "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", - "import matplotlib.pyplot as plt\n", + "from braket.circuits import Circuit\n", + "from braket.devices import LocalSimulator\n", + "\n", "%matplotlib inline\n", "\n", "# Sets the device to run the circuit on\n", @@ -244,7 +245,7 @@ "outputs": [], "source": [ "# Import local utils\n", - "from simons_utils import simons_oracle" + "from simons_utils import simons_oracle # noqa: F401" ] }, { @@ -273,7 +274,7 @@ } ], "source": [ - "s = '101011'\n", + "s = \"101011\"\n", "\n", "# Other examples to try:\n", "# s = '011'\n", @@ -282,7 +283,7 @@ "# Generate a random string of random length from 1 to 10:\n", "# s=\"\".join(str(np.random.randint(2)) for _ in range(np.random.randint(1,10)))\n", "\n", - "print(\"The secret string is: \"+ s)" + "print(\"The secret string is: \" + s)" ] }, { @@ -351,13 +352,13 @@ "circ = Circuit()\n", "\n", "# Apply Hadamard gates to first n qubits\n", - "circ.h(range(n)) \n", + "circ.h(range(n))\n", "\n", "# Now apply the Oracle for f\n", "circ.simons_oracle(s)\n", "\n", "# Apply Hadamard gates to the first n qubits\n", - "circ.h(range(n)) \n", + "circ.h(range(n))\n", "\n", "\n", "print(circ)" @@ -383,7 +384,7 @@ }, "outputs": [], "source": [ - "task = device.run(circ, shots=4*n)" + "task = device.run(circ, shots=4 * n)" ] }, { @@ -420,9 +421,9 @@ "result = task.result()\n", "\n", "counts = result.measurement_counts\n", - "plt.bar(counts.keys(), counts.values());\n", - "plt.xlabel('bit strings');\n", - "plt.ylabel('counts');\n", + "plt.bar(counts.keys(), counts.values())\n", + "plt.xlabel(\"bit strings\")\n", + "plt.ylabel(\"counts\")\n", "plt.xticks(rotation=90)\n", "plt.show()" ] @@ -472,8 +473,8 @@ " new_results[trunc_bitstring] = new_results.get(trunc_bitstring, 0) + count\n", "\n", "plt.bar(new_results.keys(), new_results.values())\n", - "plt.xlabel('bit strings');\n", - "plt.ylabel('counts');\n", + "plt.xlabel(\"bit strings\")\n", + "plt.ylabel(\"counts\")\n", "plt.xticks(rotation=70)\n", "plt.show()" ] @@ -696,8 +697,8 @@ "output_type": "stream", "text": [ "\r\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip available: \u001B[0m\u001B[31;49m22.3.1\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m23.2.1\u001B[0m\r\n", - "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n" + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\r\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\r\n" ] } ], @@ -747,17 +748,22 @@ ], "source": [ "if len(new_results.keys()) < len(s):\n", - " raise Exception ('System will be underdetermined. Minimum ' + str(n) + ' bistrings needed, but only '\n", - " + str(len(new_results.keys())) +' returned. Please rerun Simon\\'s algorithm.')\n", + " raise Exception(\n", + " \"System will be underdetermined. Minimum \"\n", + " + str(n)\n", + " + \" bistrings needed, but only \"\n", + " + str(len(new_results.keys()))\n", + " + \" returned. Please rerun Simon's algorithm.\"\n", + " )\n", "string_list = []\n", "\n", "for key in new_results.keys():\n", - "# if key!= \"0\"*n:\n", - " string_list.append( [ int(c) for c in key ] )\n", - " \n", - "print('The result in matrix form is :')\n", + " # if key!= \"0\"*n:\n", + " string_list.append([int(c) for c in key])\n", + "\n", + "print(\"The result in matrix form is :\")\n", "for a in string_list:\n", - " print (a)" + " print(a)" ] }, { @@ -789,41 +795,43 @@ } ], "source": [ - "M=Matrix(string_list).T\n", + "M = Matrix(string_list).T\n", "\n", "# Construct the agumented matrix\n", - "M_I = Matrix(np.hstack([M,np.eye(M.shape[0],dtype=int)]))\n", + "M_I = Matrix(np.hstack([M, np.eye(M.shape[0], dtype=int)]))\n", "\n", "# Perform row reduction, working modulo 2. We use the iszerofunc property of rref\n", "# to perform the Gaussian elimination over the finite field.\n", - "M_I_rref = M_I.rref(iszerofunc=lambda x: x % 2==0)\n", + "M_I_rref = M_I.rref(iszerofunc=lambda x: x % 2 == 0)\n", "\n", "# In row reduced echelon form, we can end up with a solution outside of the finite field {0,1}.\n", "# Thus, we need to revert the matrix back to this field by treating fractions as a modular inverse.\n", "# Since the denominator will always be odd (i.e. 1 mod 2), it can be ignored.\n", "\n", + "\n", "# Helper function to treat fractions as modular inverse:\n", "def mod2(x):\n", " return x.as_numer_denom()[0] % 2\n", "\n", + "\n", "# Apply our helper function to the matrix\n", "M_I_final = M_I_rref[0].applyfunc(mod2)\n", "\n", "# Extract the kernel of M from the remaining columns of the last row, when s is nonzero.\n", - "if all(value == 0 for value in M_I_final[-1,:M.shape[1]]):\n", - " result_s=\"\".join(str(c) for c in M_I_final[-1,M.shape[1]:])\n", + "if all(value == 0 for value in M_I_final[-1, : M.shape[1]]):\n", + " result_s = \"\".join(str(c) for c in M_I_final[-1, M.shape[1] :])\n", "\n", "# Otherwise, the sub-matrix will be full rank, so just set s=0...0\n", "else:\n", - " result_s='0'*M.shape[0]\n", + " result_s = \"0\" * M.shape[0]\n", "\n", "# Check whether result_s is equal to initial s:\n", - "print ('Secret string: ' + s)\n", - "print ('Result string: ' + result_s)\n", - "if (result_s == s):\n", - " print ('We found the correct answer.')\n", + "print(\"Secret string: \" + s)\n", + "print(\"Result string: \" + result_s)\n", + "if result_s == s:\n", + " print(\"We found the correct answer.\")\n", "else:\n", - " print ('Error. The answer is wrong!')" + " print(\"Error. The answer is wrong!\")" ] } ], diff --git a/examples/advanced_circuits_algorithms/Simons_Algorithm/simons_utils.py b/examples/advanced_circuits_algorithms/Simons_Algorithm/simons_utils.py index 70442b9f1..faeba7d34 100644 --- a/examples/advanced_circuits_algorithms/Simons_Algorithm/simons_utils.py +++ b/examples/advanced_circuits_algorithms/Simons_Algorithm/simons_utils.py @@ -1,5 +1,6 @@ from braket.circuits import Circuit, circuit + @circuit.subroutine(register=True) def simons_oracle(secret_s: str): """ @@ -10,26 +11,25 @@ def simons_oracle(secret_s: str): secret_s (str): secret string we wish to find """ # Find the index of the first 1 in s, to be used as the flag bit - flag_bit=secret_s.find('1') - - n=len(secret_s) - + flag_bit = secret_s.find("1") + + n = len(secret_s) + circ = Circuit() # First copy the first n qubits, so that |x>|0> -> |x>|x> for i in range(n): - circ.cnot(i, i+n) - + circ.cnot(i, i + n) + # If flag_bit=-1, s is the all-zeros string, and we do nothing else. if flag_bit != -1: # Now apply the XOR with s whenever the flag bit is 1. - for index,bit_value in enumerate(secret_s): - - if bit_value not in ['0','1']: - raise Exception ('Incorrect char \'' + bit_value + '\' in secret string s:' + secret_s) - + for index, bit_value in enumerate(secret_s): + if bit_value not in ["0", "1"]: + raise Exception("Incorrect char '" + bit_value + "' in secret string s:" + secret_s) + # XOR with s whenever the flag bit is 1. # In terms of gates, XOR means we apply an X gate only whenever the corresponding bit in s is 1. # Applying this X only when the flag qubit is 1 means this is a CNOT gate. - if(bit_value == '1'): - circ.cnot(flag_bit,index+n) + if bit_value == "1": + circ.cnot(flag_bit, index + n) return circ diff --git a/examples/analog_hamiltonian_simulation/00_Introduction_of_Analog_Hamiltonian_Simulation_with_Rydberg_Atoms.ipynb b/examples/analog_hamiltonian_simulation/00_Introduction_of_Analog_Hamiltonian_Simulation_with_Rydberg_Atoms.ipynb index f4ff2403c..28b1e58f4 100644 --- a/examples/analog_hamiltonian_simulation/00_Introduction_of_Analog_Hamiltonian_Simulation_with_Rydberg_Atoms.ipynb +++ b/examples/analog_hamiltonian_simulation/00_Introduction_of_Analog_Hamiltonian_Simulation_with_Rydberg_Atoms.ipynb @@ -37,17 +37,14 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.ahs.hamiltonian import Hamiltonian\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", + "from braket.ahs.hamiltonian import Hamiltonian\n", "\n", "register = AtomArrangement()\n", "H = Hamiltonian()\n", "\n", - "ahs_program = AnalogHamiltonianSimulation(\n", - " hamiltonian=H,\n", - " register=register\n", - ")" + "ahs_program = AnalogHamiltonianSimulation(hamiltonian=H, register=register)" ] }, { @@ -99,7 +96,7 @@ "\n", "register.add([0, 0])\n", "register.add([a, 0.0])\n", - "register.add([0.5 * a, np.sqrt(3)/2 * a]);" + "register.add([0.5 * a, np.sqrt(3) / 2 * a]);" ] }, { @@ -160,14 +157,14 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.timings.time_series import TimeSeries\n", "from braket.ahs.driving_field import DrivingField\n", + "from braket.timings.time_series import TimeSeries\n", "\n", "# e.g. trapzoid amplitude time series\n", "Omega_max = 2.5e6 # rad / seconds\n", "\n", "# e.g. the duration of the program\n", - "t_max = np.pi/(np.sqrt(2)*Omega_max) # seconds\n", + "t_max = np.pi / (np.sqrt(2) * Omega_max) # seconds\n", "\n", "# e.g. constant Rabi frequency\n", "Omega = TimeSeries()\n", @@ -178,11 +175,7 @@ "phi = TimeSeries().put(0.0, 0.0).put(t_max, 0.0) # (time [s], value [rad])\n", "Delta_global = TimeSeries().put(0.0, 0.0).put(t_max, 0.0) # (time [s], value [rad/s])\n", "\n", - "drive = DrivingField(\n", - " amplitude=Omega,\n", - " phase=phi,\n", - " detuning=Delta_global\n", - ")\n", + "drive = DrivingField(amplitude=Omega, phase=phi, detuning=Delta_global)\n", "\n", "H += drive" ] @@ -213,25 +206,20 @@ "outputs": [], "source": [ "from braket.ahs.field import Field\n", - "from braket.ahs.pattern import Pattern\n", "from braket.ahs.local_detuning import LocalDetuning\n", + "from braket.ahs.pattern import Pattern\n", "\n", "# e.g. constant strong local detuning\n", "Delta_local = TimeSeries()\n", - "Delta_local.put(0.0, -Omega_max*20) # (time [s], value [rad/s])\n", - "Delta_local.put(t_max, -Omega_max*20)\n", + "Delta_local.put(0.0, -Omega_max * 20) # (time [s], value [rad/s])\n", + "Delta_local.put(t_max, -Omega_max * 20)\n", "\n", "\n", - "# e.g. the local detuning only acts on the third atom, \n", + "# e.g. the local detuning only acts on the third atom,\n", "# which is the top atom in the triangular array.\n", "h = Pattern([0, 0, 0.5])\n", "\n", - "local_detuning = LocalDetuning(\n", - " magnitude=Field(\n", - " time_series=Delta_local,\n", - " pattern=h\n", - " )\n", - ")\n", + "local_detuning = LocalDetuning(magnitude=Field(time_series=Delta_local, pattern=h))\n", "\n", "H += local_detuning" ] @@ -294,7 +282,7 @@ "source": [ "# Note:\n", "# The van der Waals interaction term is implicitly assumed in the current version of the AHS module,\n", - "# its strength (C6 / R_{j,k}^6) is calculated (if using the local simulator) from the atomic positions \n", + "# its strength (C6 / R_{j,k}^6) is calculated (if using the local simulator) from the atomic positions\n", "# of the register, hence there is no need to specify it explicitly." ] }, @@ -438,6 +426,7 @@ "outputs": [], "source": [ "from braket.devices import LocalSimulator\n", + "\n", "device = LocalSimulator(\"braket_ahs\")" ] }, @@ -487,7 +476,10 @@ "source": [ "def get_counters_from_result(result):\n", " post_sequences = [list(measurement.post_sequence) for measurement in result.measurements]\n", - " post_sequences = [\"\".join(['r' if site==0 else 'g' for site in post_sequence]) for post_sequence in post_sequences]\n", + " post_sequences = [\n", + " \"\".join([\"r\" if site == 0 else \"g\" for site in post_sequence])\n", + " for post_sequence in post_sequences\n", + " ]\n", "\n", " counters = {}\n", " for post_sequence in post_sequences:\n", @@ -497,6 +489,7 @@ " counters[post_sequence] = 1\n", " return counters\n", "\n", + "\n", "get_counters_from_result(result)" ] }, diff --git a/examples/analog_hamiltonian_simulation/01_Introduction_to_Aquila.ipynb b/examples/analog_hamiltonian_simulation/01_Introduction_to_Aquila.ipynb index 08a734d62..5757e630a 100644 --- a/examples/analog_hamiltonian_simulation/01_Introduction_to_Aquila.ipynb +++ b/examples/analog_hamiltonian_simulation/01_Introduction_to_Aquila.ipynb @@ -46,6 +46,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -156,9 +157,10 @@ } ], "source": [ + "from pprint import pprint as pp\n", + "\n", "from braket.aws import AwsDevice\n", "from braket.devices import Devices\n", - "from pprint import pprint as pp\n", "\n", "device = AwsDevice(Devices.QuEra.Aquila)\n", "capabilities = device.properties.paradigm\n", @@ -311,9 +313,10 @@ ], "source": [ "import numpy as np\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", "from ahs_utils import show_register\n", "\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", + "\n", "separation = 5e-6\n", "block_separation = 15e-6\n", "k_max = 5\n", @@ -322,11 +325,21 @@ "register = AtomArrangement()\n", "for k in range(k_max):\n", " for m in range(m_max):\n", - " register.add((block_separation*m, block_separation*k + separation/np.sqrt(3)))\n", - " register.add((block_separation*m-separation/2, block_separation*k - separation/(2*np.sqrt(3))))\n", - " register.add((block_separation*m+separation/2, block_separation*k - separation/(2*np.sqrt(3)))) \n", + " register.add((block_separation * m, block_separation * k + separation / np.sqrt(3)))\n", + " register.add(\n", + " (\n", + " block_separation * m - separation / 2,\n", + " block_separation * k - separation / (2 * np.sqrt(3)),\n", + " )\n", + " )\n", + " register.add(\n", + " (\n", + " block_separation * m + separation / 2,\n", + " block_separation * k - separation / (2 * np.sqrt(3)),\n", + " )\n", + " )\n", "\n", - "show_register(register, show_atom_index=False, blockade_radius= 1.5 * separation)" + "show_register(register, show_atom_index=False, blockade_radius=1.5 * separation)" ] }, { @@ -499,24 +512,25 @@ }, "outputs": [], "source": [ - "from braket.timings.time_series import TimeSeries\n", "from braket.ahs.driving_field import DrivingField\n", + "from braket.timings.time_series import TimeSeries\n", "\n", - "omega_const = 1.5e7 # rad / s\n", - "rabi_pulse_area = np.pi/np.sqrt(3) # rad\n", - "omega_slew_rate_max = float(rydbergGlobal.rabiFrequencySlewRateMax) # rad/s^2\n", - "time_separation_min = float(rydbergGlobal.timeDeltaMin) # s\n", + "omega_const = 1.5e7 # rad / s\n", + "rabi_pulse_area = np.pi / np.sqrt(3) # rad\n", + "omega_slew_rate_max = float(rydbergGlobal.rabiFrequencySlewRateMax) # rad/s^2\n", + "time_separation_min = float(rydbergGlobal.timeDeltaMin) # s\n", "\n", - "amplitude = TimeSeries.trapezoidal_signal(rabi_pulse_area, omega_const, 0.99 * omega_slew_rate_max, time_separation_min=time_separation_min)\n", + "amplitude = TimeSeries.trapezoidal_signal(\n", + " rabi_pulse_area,\n", + " omega_const,\n", + " 0.99 * omega_slew_rate_max,\n", + " time_separation_min=time_separation_min,\n", + ")\n", "\n", "detuning = TimeSeries.constant_like(amplitude, 0.0)\n", "phase = TimeSeries.constant_like(amplitude, 0.0)\n", - " \n", - "drive = DrivingField(\n", - " amplitude=amplitude, \n", - " detuning=detuning, \n", - " phase=phase\n", - ")" + "\n", + "drive = DrivingField(amplitude=amplitude, detuning=detuning, phase=phase)" ] }, { @@ -551,6 +565,7 @@ ], "source": [ "from ahs_utils import show_global_drive\n", + "\n", "show_global_drive(drive);" ] }, @@ -694,13 +709,9 @@ }, "outputs": [], "source": [ - "from braket.ahs.hamiltonian import Hamiltonian\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", "\n", - "ahs_program = AnalogHamiltonianSimulation(\n", - " register=register, \n", - " hamiltonian=drive\n", - ")" + "ahs_program = AnalogHamiltonianSimulation(register=register, hamiltonian=drive)" ] }, { @@ -840,8 +851,8 @@ ], "source": [ "metadata = task.metadata()\n", - "task_arn = metadata['quantumTaskArn']\n", - "task_status = metadata['status']\n", + "task_arn = metadata[\"quantumTaskArn\"]\n", + "task_status = metadata[\"status\"]\n", "\n", "print(f\"ARN: {task_arn}\")\n", "print(f\"status: {task_status}\")" @@ -975,16 +986,15 @@ "average_density = [0, 0, 0]\n", "average_num_triangles = [0, 0, 0, 0]\n", "for key, val in counts.items():\n", - " for i in range(0, 3*k_max*m_max, 3):\n", - " short_seq = key[i:i+3]\n", + " for i in range(0, 3 * k_max * m_max, 3):\n", + " short_seq = key[i : i + 3]\n", " for j in range(3):\n", - " if short_seq[j]==\"r\":\n", - " average_density[j] += val \n", - " \n", - " \n", - " average_num_triangles[short_seq.count('r')] += val\n", - " \n", - " \n", + " if short_seq[j] == \"r\":\n", + " average_density[j] += val\n", + "\n", + " average_num_triangles[short_seq.count(\"r\")] += val\n", + "\n", + "\n", "average_density = np.array(average_density) / (k_max * m_max * n_shots)\n", "average_num_triangles = np.array(average_num_triangles) / n_shots" ] @@ -1070,8 +1080,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems.ipynb b/examples/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems.ipynb index 9a25f5836..1446070b3 100644 --- a/examples/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems.ipynb +++ b/examples/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems.ipynb @@ -48,6 +48,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -71,16 +72,13 @@ }, "outputs": [], "source": [ - "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", + "import numpy as np\n", + "from ahs_utils import show_final_avg_density, show_global_drive, show_register\n", "\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.driving_field import DrivingField\n", - "\n", - "from ahs_utils import show_register, show_global_drive, show_final_avg_density\n", - "\n", "from braket.devices import LocalSimulator" ] }, @@ -118,12 +116,12 @@ ], "source": [ "register = AtomArrangement()\n", - "separation = 6.1e-6 # in meters \n", + "separation = 6.1e-6 # in meters\n", "num_atoms = 9\n", "\n", "for k in range(num_atoms):\n", " register.add([k * separation, 0])\n", - " \n", + "\n", "show_register(register)" ] }, @@ -216,10 +214,7 @@ }, "outputs": [], "source": [ - "ahs_program = AnalogHamiltonianSimulation(\n", - " register=register, \n", - " hamiltonian=drive\n", - ")" + "ahs_program = AnalogHamiltonianSimulation(register=register, hamiltonian=drive)" ] }, { @@ -287,9 +282,12 @@ "outputs": [], "source": [ "def get_density_correlation_Z2(result):\n", - " post_sequences = np.array([list(measurement.post_sequence) for measurement in result.measurements])\n", + " post_sequences = np.array(\n", + " [list(measurement.post_sequence) for measurement in result.measurements]\n", + " )\n", " return np.cov(post_sequences.T)\n", "\n", + "\n", "gij = get_density_correlation_Z2(result)" ] }, @@ -324,13 +322,13 @@ } ], "source": [ - "plt.imshow(gij, cmap='bwr', vmin=-0.25, vmax=+0.25)\n", - "plt.xticks(range(num_atoms), [f'{i}' for i in range(num_atoms)])\n", + "plt.imshow(gij, cmap=\"bwr\", vmin=-0.25, vmax=+0.25)\n", + "plt.xticks(range(num_atoms), [f\"{i}\" for i in range(num_atoms)])\n", "plt.xlabel(\"atom index\")\n", - "plt.yticks(range(num_atoms), [f'{j}' for j in range(num_atoms)])\n", + "plt.yticks(range(num_atoms), [f\"{j}\" for j in range(num_atoms)])\n", "plt.ylabel(\"atom index\")\n", - "plt.title('Rydberg density correlation')\n", - "plt.gca().set_aspect('equal')\n", + "plt.title(\"Rydberg density correlation\")\n", + "plt.gca().set_aspect(\"equal\")\n", "plt.colorbar()\n", "plt.show()" ] @@ -377,11 +375,11 @@ ], "source": [ "register_2D = AtomArrangement()\n", - "separation = 6.7e-6 # in meters \n", + "separation = 6.7e-6 # in meters\n", "\n", "for k in range(3):\n", - " for l in range(3):\n", - " register_2D.add((k * separation, l * separation))\n", + " for i in range(3):\n", + " register_2D.add((k * separation, i * separation))\n", "\n", "show_register(register_2D)" ] @@ -417,10 +415,7 @@ } ], "source": [ - "ahs_program_2D = AnalogHamiltonianSimulation(\n", - " register=register_2D, \n", - " hamiltonian=drive\n", - ")\n", + "ahs_program_2D = AnalogHamiltonianSimulation(register=register_2D, hamiltonian=drive)\n", "\n", "result_2D = device.run(ahs_program_2D, shots=1000, steps=50, blockade_radius=7.9e-6).result()\n", "show_final_avg_density(result_2D)" @@ -470,6 +465,7 @@ "source": [ "from braket.aws import AwsDevice\n", "from braket.devices import Devices\n", + "\n", "device = AwsDevice(Devices.QuEra.Aquila)" ] }, @@ -533,13 +529,13 @@ "source": [ "gij_aquila = get_density_correlation_Z2(result_1D_aquila)\n", "\n", - "plt.imshow(gij_aquila, cmap='bwr', vmin=-0.25, vmax=+0.25)\n", - "plt.xticks(range(num_atoms), [f'{i}' for i in range(num_atoms)])\n", + "plt.imshow(gij_aquila, cmap=\"bwr\", vmin=-0.25, vmax=+0.25)\n", + "plt.xticks(range(num_atoms), [f\"{i}\" for i in range(num_atoms)])\n", "plt.xlabel(\"atom index\")\n", - "plt.yticks(range(num_atoms), [f'{j}' for j in range(num_atoms)])\n", + "plt.yticks(range(num_atoms), [f\"{j}\" for j in range(num_atoms)])\n", "plt.ylabel(\"atom index\")\n", - "plt.title('Rydberg density correlation')\n", - "plt.gca().set_aspect('equal')\n", + "plt.title(\"Rydberg density correlation\")\n", + "plt.gca().set_aspect(\"equal\")\n", "plt.colorbar()\n", "plt.show()" ] @@ -604,8 +600,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila.ipynb b/examples/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila.ipynb index 2d8518ba1..d83c48024 100644 --- a/examples/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila.ipynb +++ b/examples/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila.ipynb @@ -28,6 +28,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -53,8 +54,8 @@ }, "outputs": [], "source": [ - "from braket.ahs.atom_arrangement import AtomArrangement\n", - "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation" + "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", + "from braket.ahs.atom_arrangement import AtomArrangement" ] }, { @@ -141,7 +142,6 @@ }, "outputs": [], "source": [ - "import numpy as np\n", "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.aws import AwsDevice\n", "from braket.devices import Devices\n", @@ -157,7 +157,7 @@ "interproblem_distance = 3 * distance\n", "\n", "# setting up a grid of problems filling the total area\n", - "n_width = int(float(field_of_view_width) // (single_problem_width + interproblem_distance))\n", + "n_width = int(float(field_of_view_width) // (single_problem_width + interproblem_distance))\n", "n_height = int(float(field_of_view_height) // (single_problem_height + interproblem_distance))" ] }, @@ -190,27 +190,28 @@ "batch_mapping = dict()\n", "parallel_register = AtomArrangement()\n", "\n", - "atom_number = 0 #counting number of atoms added\n", + "atom_number = 0 # counting number of atoms added\n", "\n", "for ix in range(n_width):\n", - " x_shift = ix * (single_problem_width + interproblem_distance)\n", + " x_shift = ix * (single_problem_width + interproblem_distance)\n", "\n", - " for iy in range(n_height): \n", - " y_shift = iy * (single_problem_height + interproblem_distance)\n", + " for iy in range(n_height):\n", + " y_shift = iy * (single_problem_height + interproblem_distance)\n", "\n", " # reached the maximum number of batches possible given n_site_max\n", - " if atom_number + len(register) > n_site_max: break \n", + " if atom_number + len(register) > n_site_max:\n", + " break\n", "\n", " atoms = []\n", " for site in register:\n", " new_coordinate = (x_shift + site.coordinate[0], y_shift + site.coordinate[1])\n", - " parallel_register.add(new_coordinate,site.site_type)\n", + " parallel_register.add(new_coordinate, site.site_type)\n", "\n", " atoms.append(atom_number)\n", "\n", " atom_number += 1\n", "\n", - " batch_mapping[(ix,iy)] = atoms" + " batch_mapping[(ix, iy)] = atoms" ] }, { @@ -239,7 +240,7 @@ } ], "source": [ - "# Key indicates the position of the batch itself on a unitless grid, \n", + "# Key indicates the position of the batch itself on a unitless grid,\n", "# with dictionary value being the atom number\n", "batch_mapping" ] @@ -314,13 +315,13 @@ "source": [ "from braket.ahs.driving_field import DrivingField\n", "\n", - "time_points = [0, 2.5e-7, 2.75e-6, 3e-6] # s\n", + "time_points = [0, 2.5e-7, 2.75e-6, 3e-6] # s\n", "\n", "amplitude_min = 0\n", "amplitude_max = 1.5708e7 # rad / s\n", "\n", "detuning_min = -5.49778714e7 # rad / s\n", - "detuning_max = 5.49778714e7 # rad / s\n", + "detuning_max = 5.49778714e7 # rad / s\n", "\n", "amplitude_values = [amplitude_min, amplitude_max, amplitude_max, amplitude_min]\n", "detuning_values = [detuning_min, detuning_min, detuning_max, detuning_max]\n", @@ -379,15 +380,9 @@ }, "outputs": [], "source": [ - "parallel_ahs_program = AnalogHamiltonianSimulation(\n", - " register=parallel_register, \n", - " hamiltonian=drive\n", - ")\n", + "parallel_ahs_program = AnalogHamiltonianSimulation(register=parallel_register, hamiltonian=drive)\n", "\n", - "ahs_program = AnalogHamiltonianSimulation(\n", - " register=register, \n", - " hamiltonian=drive\n", - ")\n", + "ahs_program = AnalogHamiltonianSimulation(register=register, hamiltonian=drive)\n", "\n", "ahs_program = ahs_program.discretize(qpu)\n", "parallel_ahs_program = parallel_ahs_program.discretize(qpu)" @@ -422,6 +417,7 @@ "outputs": [], "source": [ "from braket.devices import LocalSimulator\n", + "\n", "sim = LocalSimulator(\"braket_ahs\")\n", "\n", "sim_result = sim.run(ahs_program, shots=400, steps=100).result()" @@ -506,7 +502,7 @@ "all_sequences = []\n", "for measurement in qpu_result.measurements:\n", " # iterate over key and values\n", - " for (ix,iy),inds in batch_mapping.items():\n", + " for (ix, iy), inds in batch_mapping.items():\n", " batch_sequence = list(measurement.post_sequence[inds])\n", " all_sequences.append(batch_sequence)\n", "\n", @@ -551,17 +547,15 @@ "from ahs_utils import plot_avg_density_2D\n", "\n", "# Compare results side-by-side\n", - "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12,5))\n", + "fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(12, 5))\n", "\n", "# plot density of all batches that ran in parallel with geometry and averaged values of single batch\n", "\n", - "plot_avg_density_2D(qpu_density, parallel_register, batch_mapping=batch_mapping, custom_axes = ax1);\n", - "ax1.set_title(\"Averages of Densities across parallelized batches\");\n", - "\n", + "plot_avg_density_2D(qpu_density, parallel_register, batch_mapping=batch_mapping, custom_axes=ax1)\n", + "ax1.set_title(\"Averages of Densities across parallelized batches\")\n", "# plot density of simulator result\n", - "plot_avg_density_2D(sim_density, register, custom_axes = ax2);\n", - "ax2.set_title(\"Simulator Result\");\n", - "\n", + "plot_avg_density_2D(sim_density, register, custom_axes=ax2)\n", + "ax2.set_title(\"Simulator Result\")\n", "plt.show()" ] }, @@ -598,8 +592,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] } ], diff --git a/examples/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation.ipynb b/examples/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation.ipynb index 8804b26c0..4dbf70292 100644 --- a/examples/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation.ipynb +++ b/examples/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation.ipynb @@ -79,22 +79,18 @@ "outputs": [], "source": [ "# necessary imports\n", + "import time\n", + "\n", + "import matplotlib.pyplot as plt\n", "import networkx as nx\n", + "import numpy as np\n", + "from scipy import optimize\n", "\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", - "\n", - "from braket.timings.time_series import TimeSeries\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.driving_field import DrivingField\n", - "from braket.ahs.local_detuning import LocalDetuning\n", - "from braket.ahs.field import Field\n", "from braket.devices import LocalSimulator\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import time\n", - "import numpy as np\n", - "\n", - "from scipy import optimize" + "from braket.timings.time_series import TimeSeries" ] }, { @@ -123,39 +119,40 @@ "metadata": {}, "outputs": [], "source": [ - "def generate_unit_disk(atoms_l: int, atoms_w: int, scale=4.0*1e-6, dropout=0.45):\n", + "def generate_unit_disk(atoms_l: int, atoms_w: int, scale=4.0 * 1e-6, dropout=0.45):\n", " atom_list = []\n", " edge_dict = {}\n", " atom_to_edge = {}\n", " for ii in range(atoms_l):\n", " for jj in range(atoms_w):\n", - " atom_list.append((ii*scale, jj*scale))\n", - " atom_to_edge[(ii*scale, jj*scale)] = ii*atoms_w + jj\n", - " edge_dict[ii*atoms_w + jj] = []\n", + " atom_list.append((ii * scale, jj * scale))\n", + " atom_to_edge[(ii * scale, jj * scale)] = ii * atoms_w + jj\n", + " edge_dict[ii * atoms_w + jj] = []\n", " if jj < atoms_w - 1:\n", - " edge_dict[ii*atoms_w + jj].append(ii*atoms_w + jj + 1)\n", + " edge_dict[ii * atoms_w + jj].append(ii * atoms_w + jj + 1)\n", " if ii < atoms_l - 1:\n", - " edge_dict[ii*atoms_w + jj].append((ii+1)*atoms_w + jj)\n", + " edge_dict[ii * atoms_w + jj].append((ii + 1) * atoms_w + jj)\n", " if ii < atoms_l - 1 and jj < atoms_w - 1:\n", " # nearest neighbor\n", - " edge_dict[ii*atoms_w + jj].append((ii+1)*atoms_w + jj + 1)\n", + " edge_dict[ii * atoms_w + jj].append((ii + 1) * atoms_w + jj + 1)\n", " if jj > 0 and ii < atoms_l - 1:\n", " # nearest neighbor\n", - " edge_dict[ii*atoms_w + jj].append((ii+1)*atoms_w + jj - 1)\n", + " edge_dict[ii * atoms_w + jj].append((ii + 1) * atoms_w + jj - 1)\n", "\n", " graph = nx.from_dict_of_lists(edge_dict)\n", - " \n", + "\n", " # perform dropout\n", " new_len = int(np.round(len(atom_list) * (1 - dropout)))\n", " atom_arr = np.empty(len(atom_list), dtype=object)\n", " atom_arr[:] = atom_list\n", " remaining_atom_list = np.random.choice(atom_arr, new_len, replace=False)\n", - " \n", - " dropped_edge_dict = {}\n", + "\n", " atoms = AtomArrangement()\n", " for atom in remaining_atom_list:\n", " atoms.add(atom)\n", - " graph.remove_nodes_from([atom_to_edge[atom] for atom in set(atom_list) - set(list(remaining_atom_list))])\n", + " graph.remove_nodes_from(\n", + " [atom_to_edge[atom] for atom in set(atom_list) - set(list(remaining_atom_list))]\n", + " )\n", "\n", " return atoms, graph" ] @@ -194,7 +191,7 @@ ], "source": [ "fig, ax = plt.subplots()\n", - "pos = {ii: (ii/atoms_w,ii%atoms_w) for ii in graph.nodes()}\n", + "pos = {ii: (ii / atoms_w, ii % atoms_w) for ii in graph.nodes()}\n", "nx.draw(graph, pos=pos, ax=ax, with_labels=True)\n", "plt.show()" ] @@ -216,9 +213,9 @@ " assert len(x) == 3\n", " Delta_start = -13 * 2 * np.pi * 1e6\n", " Delta_0 = 11 * 2 * np.pi * 1e6\n", - " Delta_end = 11 * 2 * np.pi * 1e6\n", + " Delta_end = 11 * 2 * np.pi * 1e6\n", "\n", - " Omega_max = 2.5e7 # 4 * 2 * np.pi * 1e6\n", + " Omega_max = 2.5e7 # 4 * 2 * np.pi * 1e6\n", " T_max = 0.6 * 1e-6\n", "\n", " Deltas = TimeSeries()\n", @@ -229,7 +226,7 @@ " Deltas.put(0.4 * 1e-6, Delta_0 * x[2])\n", " Deltas.put(0.55 * 1e-6, Delta_end)\n", " Deltas.put(T_max, Delta_end)\n", - " \n", + "\n", " # keep amplitude (Rabi frequency) constant once we turn it on\n", " Omegas = TimeSeries()\n", " Omegas.put(0.0, 0.0)\n", @@ -245,38 +242,36 @@ " # for this problem, our Hamiltonian has no local detuning\n", " H = DrivingField(amplitude=Omegas, phase=Phi, detuning=Deltas)\n", "\n", - " \n", " program = AnalogHamiltonianSimulation(hamiltonian=H, register=atoms)\n", " device = LocalSimulator(\"braket_ahs\")\n", - " \n", + "\n", " # if you want to use Aquila, uncomment these lines\n", " # keep in mind that you may have to modify the fields\n", " # device = AwsDevice(Devices.QuEra.Aquila)\n", " # program = program.discretize(device)\n", - " \n", + "\n", " # run the AHS program and extract measurements\n", " results = device.run(program, shots=1000, steps=100).result()\n", - " \n", - " \n", + "\n", " r_counts = []\n", - " \n", + "\n", " # states are one of:\n", " # 'e' - empty\n", " # 'r' - Rydberg\n", " # 'g' - groundstate\n", - " states = ['e', 'r', 'g']\n", + " states = [\"e\", \"r\", \"g\"]\n", " for shot in results.measurements:\n", " pre = shot.pre_sequence\n", " post = shot.post_sequence\n", " state_idx = np.array(pre) * (1 + np.array(post))\n", " state_labels = [states[s_idx] for s_idx in state_idx]\n", - " r_count = np.count_nonzero([sl == 'r' for sl in state_labels])/len(atoms)\n", + " r_count = np.count_nonzero([sl == \"r\" for sl in state_labels]) / len(atoms)\n", " r_counts.append(r_count)\n", "\n", " # the mean density of Rydberg states - this will be our cost\n", " # higher is better, as it corresponds to a larger independent set\n", " density_sum = np.mean(r_counts)\n", - " \n", + "\n", " return -density_sum, results, Deltas" ] }, @@ -303,7 +298,9 @@ "initial_rydberg_density, initial_registers, initial_Deltas = loss_piecewise_linear(atoms, x0)\n", "print(f\"Initial density: {initial_rydberg_density}\")\n", "# perform optimization\n", - "optresult = optimize.minimize(lambda x: loss_piecewise_linear(atoms, x)[0], x0, method='Nelder-Mead', options={'maxiter': 10})\n", + "optresult = optimize.minimize(\n", + " lambda x: loss_piecewise_linear(atoms, x)[0], x0, method=\"Nelder-Mead\", options={\"maxiter\": 10}\n", + ")\n", "final_rydberg_density, final_registers, final_Deltas = loss_piecewise_linear(atoms, optresult.x)\n", "print(f\"Final density: {final_rydberg_density}\")\n", "print(f\"Final values: {optresult.x}\")\n", @@ -414,7 +411,7 @@ "source": [ "from collections import Counter\n", "\n", - "states = ['e', 'r', 'g']\n", + "states = [\"e\", \"r\", \"g\"]\n", "state_labels = []\n", "for shot in final_registers.measurements:\n", " pre = shot.pre_sequence\n", @@ -427,9 +424,18 @@ "most_frequent_regs = occurence_count.most_common(5)\n", "for ii in range(len(most_frequent_regs)):\n", " fig, ax = plt.subplots()\n", - " vert_colors = ['red' if (most_frequent_regs[ii][0][i] == 'r') else 'blue' for i in range(len(most_frequent_regs[ii][0]))]\n", - " print(f'Independent set of {ii}-th most likely outcome')\n", - " nx.draw(graph, pos = {ii: (ii/atoms_w,ii%atoms_w) for ii in graph.nodes()}, ax=ax, with_labels=True, node_color=vert_colors)\n", + " vert_colors = [\n", + " \"red\" if (most_frequent_regs[ii][0][i] == \"r\") else \"blue\"\n", + " for i in range(len(most_frequent_regs[ii][0]))\n", + " ]\n", + " print(f\"Independent set of {ii}-th most likely outcome\")\n", + " nx.draw(\n", + " graph,\n", + " pos={ii: (ii / atoms_w, ii % atoms_w) for ii in graph.nodes()},\n", + " ax=ax,\n", + " with_labels=True,\n", + " node_color=vert_colors,\n", + " )\n", " plt.show()" ] }, diff --git a/examples/analog_hamiltonian_simulation/05_Running_Analog_Hamiltonian_Simulation_with_local_simulator.ipynb b/examples/analog_hamiltonian_simulation/05_Running_Analog_Hamiltonian_Simulation_with_local_simulator.ipynb index da20bb91a..2b9336680 100644 --- a/examples/analog_hamiltonian_simulation/05_Running_Analog_Hamiltonian_Simulation_with_local_simulator.ipynb +++ b/examples/analog_hamiltonian_simulation/05_Running_Analog_Hamiltonian_Simulation_with_local_simulator.ipynb @@ -19,15 +19,15 @@ "metadata": {}, "outputs": [], "source": [ - "import numpy as np\n", "import time\n", "\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", + "import numpy as np\n", + "from ahs_utils import plot_avg_density_2D, show_global_drive, show_register\n", + "\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", - "from braket.devices import LocalSimulator\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.driving_field import DrivingField\n", - "\n", - "from ahs_utils import show_register, show_global_drive, plot_avg_density_2D" + "from braket.devices import LocalSimulator" ] }, { @@ -68,19 +68,19 @@ ], "source": [ "register = AtomArrangement()\n", - "separation = 6.7e-6 # in meters \n", + "separation = 6.7e-6 # in meters\n", "\n", "for k in range(3):\n", - " for l in range(3):\n", - " register.add((k * separation, l * separation))\n", + " for i in range(3):\n", + " register.add((k * separation, i * separation))\n", "\n", "\n", "time_points = [0, 2.5e-7, 2.75e-6, 3e-6]\n", - "amplitude_min = 0 # rad / s\n", + "amplitude_min = 0 # rad / s\n", "amplitude_max = 1.57e7 # rad / s\n", "\n", - "detuning_min = -5.5e7 # rad / s\n", - "detuning_max = 5.5e7 # rad / s\n", + "detuning_min = -5.5e7 # rad / s\n", + "detuning_max = 5.5e7 # rad / s\n", "\n", "amplitude_values = [amplitude_min, amplitude_max, amplitude_max, amplitude_min] # piecewise linear\n", "detuning_values = [detuning_min, detuning_min, detuning_max, detuning_max] # piecewise linear\n", @@ -88,7 +88,7 @@ "\n", "\n", "drive = DrivingField.from_lists(time_points, amplitude_values, detuning_values, phase_values)\n", - " \n", + "\n", "show_register(register)\n", "show_global_drive(drive)" ] @@ -108,10 +108,7 @@ "metadata": {}, "outputs": [], "source": [ - "ahs_program = AnalogHamiltonianSimulation(\n", - " register=register, \n", - " hamiltonian=drive\n", - ")" + "ahs_program = AnalogHamiltonianSimulation(register=register, hamiltonian=drive)" ] }, { @@ -277,7 +274,7 @@ "n_full = result_full.get_avg_density()\n", "n_blockade = result_blockade.get_avg_density()\n", "\n", - "RMS_blockade = np.sqrt(np.mean((np.array(n_full)-np.array(n_blockade))**2))\n", + "RMS_blockade = np.sqrt(np.mean((np.array(n_full) - np.array(n_blockade)) ** 2))\n", "print(f\"The RMS_blockade for the final Rydberg densities = {RMS_blockade}\")" ] }, @@ -365,7 +362,7 @@ "source": [ "n_reduced_nsteps = result_reduced_nsteps.get_avg_density()\n", "\n", - "RMS_reduced_nsteps = np.sqrt(np.mean((np.array(n_full)-np.array(n_reduced_nsteps))**2))\n", + "RMS_reduced_nsteps = np.sqrt(np.mean((np.array(n_full) - np.array(n_reduced_nsteps)) ** 2))\n", "print(f\"The RMS_reduced_nsteps for the final Rydberg densities = {RMS_reduced_nsteps}\")" ] }, diff --git a/examples/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane.ipynb b/examples/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane.ipynb index 183df61fa..c36886c6a 100644 --- a/examples/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane.ipynb +++ b/examples/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane.ipynb @@ -29,6 +29,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -55,25 +56,25 @@ "import matplotlib.pyplot as plt\n", "\n", "# For realizing the AFM order, the atomic spacing is typically\n", - "# chosen between 6 and 7 micrometers. The interested readers are \n", + "# chosen between 6 and 7 micrometers. The interested readers are\n", "# encouraged to try other values of atomic spacing!\n", - "a = 6.1 # μm\n", + "a = 6.1 # μm\n", "num_atoms = 9\n", "coords = []\n", "for k in range(num_atoms):\n", " coords.append([k * a, 0])\n", "\n", - "plt.figure(figsize=(5,1)) \n", + "plt.figure(figsize=(5, 1))\n", "\n", "plt.scatter([x for x, y in coords], [y for x, y in coords])\n", "\n", - "# Add the labels for the atoms \n", + "# Add the labels for the atoms\n", "for idx, site in enumerate(coords):\n", " plt.text(site[0], site[1], f\" {idx}\", fontsize=10)\n", "\n", "plt.xlabel(\"μm\")\n", "plt.ylabel(\"μm\")\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -110,28 +111,29 @@ "import pennylane.numpy as np\n", "\n", "# Rydberg interaction constant\n", - "C6 = 862619.79 # MHz μm^6\n", + "C6 = 862619.79 # MHz μm^6\n", "\n", "# Constraints for the driving fields with SI unit, the unit used by Braket\n", - "amplitude_max = 1.58e7 # rad/second\n", - "detuning_max = 1.25e8 # rad/second\n", - "time_max_second = 4e-6 # second\n", + "amplitude_max = 1.58e7 # rad/second\n", + "detuning_max = 1.25e8 # rad/second\n", + "time_max_second = 4e-6 # second\n", "\n", "\n", "def angular_SI_to_MHz(angular_SI):\n", " \"\"\"Converts a value in rad/s or (rad/s)/s into MHz or MHz/s\"\"\"\n", " return angular_SI / (2 * np.pi) * 1e-6\n", "\n", + "\n", "# Pennylane uses microseconds for time so the unit of time is converted from second to microsecond\n", - "time_max = time_max_second * 1e6 # microsecond\n", + "time_max = time_max_second * 1e6 # microsecond\n", "\n", "# Pennylane uses MHz for amplitude and detuning so their units are converted from rad/second to MHz\n", - "amplitude_max = angular_SI_to_MHz(amplitude_max) # MHz\n", - "detuning_max = angular_SI_to_MHz(detuning_max) # MHz\n", + "amplitude_max = angular_SI_to_MHz(amplitude_max) # MHz\n", + "detuning_max = angular_SI_to_MHz(detuning_max) # MHz\n", "\n", "print(f\"amplitude_max = {round(amplitude_max, 2)} MHz\")\n", "print(f\"detuning_max = {round(detuning_max, 2)} MHz\")\n", - "print(f\"time_max = {time_max} μs\")\n" + "print(f\"time_max = {time_max} μs\")" ] }, { @@ -151,21 +153,23 @@ }, "outputs": [], "source": [ - "import jax.numpy as jnp\n", "import jax\n", + "import jax.numpy as jnp\n", "\n", "# Set to float64 precision and remove jax CPU/GPU warning\n", "jax.config.update(\"jax_enable_x64\", True)\n", "jax.config.update(\"jax_platform_name\", \"cpu\")\n", "jax.config.update(\"jax_debug_nans\", True)\n", "\n", + "\n", "def ryd_amplitude(p, t):\n", " \"\"\"Parametrized function for amplitude\"\"\"\n", - " return p[0] * (1-(1-jnp.sin(jnp.pi * t/time_max)**2)**(p[1]/2))\n", + " return p[0] * (1 - (1 - jnp.sin(jnp.pi * t / time_max) ** 2) ** (p[1] / 2))\n", + "\n", "\n", "def ryd_detuning(p, t):\n", " \"\"\"Parametrized function for detuning\"\"\"\n", - " return p[0] * jnp.arctan(p[1] * (t-time_max/2)) / (jnp.pi/2)\n" + " return p[0] * jnp.arctan(p[1] * (t - time_max / 2)) / (jnp.pi / 2)" ] }, { @@ -203,7 +207,7 @@ "# These parameters are chosen arbitrarily for demonstration purpose.\n", "# The readers are encouraged to try out other parameters!\n", "amplitude_param = [amplitude_max, 10]\n", - "detuning_param = [detuning_max * 2/3, 1.45]\n", + "detuning_param = [detuning_max * 2 / 3, 1.45]\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(10, 4))\n", "axes[0].plot(vis_time, [ryd_amplitude(amplitude_param, t) for t in vis_time])\n", @@ -213,7 +217,7 @@ "axes[1].set_ylabel(\"detuning (MHz)\")\n", "axes[1].set_xlabel(\"time (μs)\")\n", "fig.subplots_adjust(wspace=0.3)\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -235,7 +239,9 @@ "source": [ "import pennylane as qml\n", "\n", - "global_drive = qml.pulse.rydberg_drive(amplitude=ryd_amplitude, phase=0, detuning=ryd_detuning, wires=range(len(coords)))" + "global_drive = qml.pulse.rydberg_drive(\n", + " amplitude=ryd_amplitude, phase=0, detuning=ryd_detuning, wires=range(len(coords))\n", + ")" ] }, { @@ -279,7 +285,8 @@ "source": [ "ts = [0, time_max]\n", "\n", - "def program(detuning_param, amplitude_param = amplitude_param, ts = ts):\n", + "\n", + "def program(detuning_param, amplitude_param=amplitude_param, ts=ts):\n", " qml.evolve(H_ryd)([amplitude_param, detuning_param], ts)\n", " return qml.counts()" ] @@ -344,13 +351,14 @@ "def get_prob(counts):\n", " \"\"\"Helper function for calculating the Rydberg probability averaged over all the shots\"\"\"\n", " prob = np.zeros(9)\n", - " total_shots = 0 # Total number of shots in the counts\n", + " total_shots = 0 # Total number of shots in the counts\n", " for key, val in counts.items():\n", " prob += np.array([int(bit) for bit in [*key]]) * val\n", " total_shots += val\n", " prob /= total_shots\n", " return prob\n", "\n", + "\n", "prob_pl = get_prob(counts_pl)\n", "\n", "fig, axs = plt.subplots(1, 1)\n", @@ -391,9 +399,11 @@ "source": [ "# Initialize the cost function\n", "H_cost = 0\n", - "for i in range(len(coords)-2):\n", + "for i in range(len(coords) - 2):\n", " # Add the contribution from each domain wall\n", - " H_cost += qml.prod(qml.Projector([1], wires=[i]) - 1/2, qml.Projector([1], wires=[i+1]) -1/2)" + " H_cost += qml.prod(\n", + " qml.Projector([1], wires=[i]) - 1 / 2, qml.Projector([1], wires=[i + 1]) - 1 / 2\n", + " )" ] }, { @@ -420,9 +430,10 @@ "# Define the PennyLane local simulator\n", "dev = qml.device(\"default.qubit.jax\", wires=range(len(coords)))\n", "\n", + "\n", "# Define the qnode that evolves the Rydberg system, followed by calculating the cost function\n", "@qml.qnode(dev, interface=\"jax\")\n", - "def program_cost(detuning_param, amplitude_param = amplitude_param, ts = ts):\n", + "def program_cost(detuning_param, amplitude_param=amplitude_param, ts=ts):\n", " qml.evolve(H_ryd)([amplitude_param, detuning_param], ts)\n", " return qml.expval(H_cost)" ] @@ -453,7 +464,7 @@ } ], "source": [ - "theta = detuning_param.copy() \n", + "theta = detuning_param.copy()\n", "initial_cost = program_cost(theta)\n", "print(f\"The initial parameter for detuning = {theta}\")\n", "print(f\"The initial cost value = {initial_cost}\")" @@ -563,7 +574,7 @@ " gradients[n] = np.mean(np.abs(grad_program))\n", "\n", " print(n, \" \", val)\n", - " \n", + "\n", "print(f\"The final parameter for detuning = {[float(i) for i in theta]}\")" ] }, @@ -643,8 +654,14 @@ "axes[0].plot(vis_time, [ryd_amplitude(amplitude_param, t) for t in vis_time])\n", "axes[0].set_xlabel(\"time (μs)\")\n", "axes[0].set_ylabel(\"amplitude (MHz)\")\n", - "axes[1].plot(vis_time, [ryd_detuning(detuning_param, t) for t in vis_time], label=\"detuning before optimization\")\n", - "axes[1].plot(vis_time, [ryd_detuning(theta, t) for t in vis_time], label=\"detuning after optimization\")\n", + "axes[1].plot(\n", + " vis_time,\n", + " [ryd_detuning(detuning_param, t) for t in vis_time],\n", + " label=\"detuning before optimization\",\n", + ")\n", + "axes[1].plot(\n", + " vis_time, [ryd_detuning(theta, t) for t in vis_time], label=\"detuning after optimization\"\n", + ")\n", "axes[1].set_ylabel(\"detuning (MHz)\")\n", "axes[1].set_xlabel(\"time (μs)\")\n", "axes[1].legend()\n", @@ -675,10 +692,7 @@ "\n", "shots = 100\n", "aquila = qml.device(\n", - " \"braket.aws.ahs\",\n", - " device_arn=Devices.QuEra.Aquila,\n", - " wires=len(coords),\n", - " shots = shots\n", + " \"braket.aws.ahs\", device_arn=Devices.QuEra.Aquila, wires=len(coords), shots=shots\n", ")\n", "\n", "program_cost_aquila = qml.QNode(program, aquila)\n", @@ -708,24 +722,24 @@ "def process_aquila_counts(counts_aquila):\n", " \"\"\"Process the counts from Aquila before calculating the Rydberg probability\n", "\n", - " Note 1: For the counts returned from Aquila, a Rydberg state is indicated as\n", - " `1.0` instead of `1`. We will convert it to `1` for consistency with \n", - " the counts returned from PennyLane local simulator. Similarly, we will\n", - " convert `0.0` to `0` for the ground state.\n", - " \n", - " Note 2: For the counts returned from Aquila, certain shot result may contain \n", - " 'nan' in addition to '1' or '0', due to the noise in the device. For \n", - " shot result contains 'nan', we will not include it in the calculation \n", - " of Rydberg probability. \n", + " Note 1: For the counts returned from Aquila, a Rydberg state is indicated as\n", + " `1.0` instead of `1`. We will convert it to `1` for consistency with\n", + " the counts returned from PennyLane local simulator. Similarly, we will\n", + " convert `0.0` to `0` for the ground state.\n", + "\n", + " Note 2: For the counts returned from Aquila, certain shot result may contain\n", + " 'nan' in addition to '1' or '0', due to the noise in the device. For\n", + " shot result contains 'nan', we will not include it in the calculation\n", + " of Rydberg probability.\n", " \"\"\"\n", " counts_aquila_updated = {}\n", "\n", " for key, val in counts_aquila.items():\n", - " if 'nan' not in key:\n", - " newkey = [key[i:i+3] for i in range(0, len(key), 3)]\n", - " newkey = ''.join(['1' if a == '1.0' else ('0' if a == '0.0' else a) for a in newkey])\n", + " if \"nan\" not in key:\n", + " newkey = [key[i : i + 3] for i in range(0, len(key), 3)]\n", + " newkey = \"\".join([\"1\" if a == \"1.0\" else (\"0\" if a == \"0.0\" else a) for a in newkey])\n", " counts_aquila_updated[newkey] = val\n", - " \n", + "\n", " return counts_aquila_updated" ] }, @@ -818,8 +832,12 @@ "source": [ "print(\"Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms.ipynb b/examples/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms.ipynb index c7892e18f..d50280b05 100644 --- a/examples/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms.ipynb +++ b/examples/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", "metadata": { "pycharm": { "name": "#%% md\n" @@ -57,6 +58,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -67,23 +69,22 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.ahs.hamiltonian import Hamiltonian\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", - "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", - "from braket.timings import TimeSeries\n", - "from braket.ahs.driving_field import DrivingField\n", - "from braket.ahs.local_detuning import LocalDetuning\n", + "import time\n", "\n", + "import matplotlib.pylab as plt\n", + "import numpy as np\n", "from ahs_utils import (\n", - " show_drive_and_local_detuning, \n", - " show_final_avg_density, \n", + " show_drive_and_local_detuning,\n", + " show_final_avg_density,\n", ")\n", "\n", - "import numpy as np\n", - "import matplotlib.pylab as plt\n", - "import time\n", - "\n", + "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", + "from braket.ahs.driving_field import DrivingField\n", + "from braket.ahs.local_detuning import LocalDetuning\n", "from braket.devices import LocalSimulator\n", + "from braket.timings import TimeSeries\n", + "\n", "simulator = LocalSimulator(\"braket_ahs\")" ] }, @@ -102,20 +103,20 @@ "metadata": {}, "outputs": [], "source": [ - "omega_max = 15800000.0 # rad / seconds\n", - "omega_slew_rate_max = 250000000000000.0 # rad / seconds / seconds\n", - "tmin = 5e-08 # seconds\n", + "omega_max = 15800000.0 # rad / seconds\n", + "omega_slew_rate_max = 250000000000000.0 # rad / seconds / seconds\n", + "tmin = 5e-08 # seconds\n", "\n", "# local_detuning_max = 125000000.0 # rad / seconds\n", "# local_detuning_slew_rate_max = 2500000000000000.0 # rad / seconds\n", "\n", - "local_detuning_max = (2*np.pi*7.5)*1e6 # rad / seconds\n", - "local_detuning_slew_rate_max = (2*np.pi*7.5)*1e12 # rad / seconds / seconds\n", + "local_detuning_max = (2 * np.pi * 7.5) * 1e6 # rad / seconds\n", + "local_detuning_slew_rate_max = (2 * np.pi * 7.5) * 1e12 # rad / seconds / seconds\n", "\n", - "t_ramp_omega = omega_max/omega_slew_rate_max # seconds\n", - "t_ramp_local_detuning = local_detuning_max/local_detuning_slew_rate_max # seconds\n", + "t_ramp_omega = omega_max / omega_slew_rate_max # seconds\n", + "t_ramp_local_detuning = local_detuning_max / local_detuning_slew_rate_max # seconds\n", "\n", - "detuning_max = 125000000.0 # rad / seconds" + "detuning_max = 125000000.0 # rad / seconds" ] }, { @@ -135,11 +136,11 @@ "metadata": {}, "outputs": [], "source": [ - "N = 9 # 4n+1\n", + "N = 9 # 4n+1\n", "a = 5.5e-6\n", "register = AtomArrangement()\n", "for ind in range(N):\n", - " register.add([0, ind * a])\n" + " register.add([0, ind * a])" ] }, { @@ -181,29 +182,29 @@ ], "source": [ "def prepare_states(\n", - " indices, \n", - " omega_max=omega_max, \n", - " omega_slew_rate_max=omega_slew_rate_max, \n", + " indices,\n", + " omega_max=omega_max,\n", + " omega_slew_rate_max=omega_slew_rate_max,\n", " local_detuning_max=local_detuning_max,\n", - " register=register, \n", - " run_and_show = True\n", + " register=register,\n", + " run_and_show=True,\n", "):\n", " \"\"\"\n", " Return the driving field and local detuning for preparing the initial state\n", - " \n", + "\n", " Args:\n", " indices: A list of atoms that are in the rydberg states\n", " omega_max: The maximum value of the Rabi frequency\n", " omega_slew_rate: The maximum value of the slew rate for the Rabi frequency\n", " local_detuning_max: The maximum value of the local detuning\n", " register: The register for the anlog Hamiltonian simulation program\n", - " run_and_show: If true, run the anlog Hamiltonian simulation program \n", + " run_and_show: If true, run the anlog Hamiltonian simulation program\n", " and show the final average density\n", - " \n", + "\n", " Returns:\n", " drive: The driving field to prepare the initial state\n", - " local_detuning: The local detuning to prepare the initial state \n", - " \n", + " local_detuning: The local detuning to prepare the initial state\n", + "\n", " \"\"\"\n", "\n", " amplitude = TimeSeries.trapezoidal_signal(np.pi, omega_max, omega_slew_rate_max)\n", @@ -211,7 +212,9 @@ "\n", " drive_time_points = np.array(drive_time_points) + t_ramp_local_detuning\n", " drive_time_points = np.insert(drive_time_points, 0, 0.0)\n", - " drive_time_points = np.insert(drive_time_points, len(drive_time_points), drive_time_points[-1]+t_ramp_local_detuning)\n", + " drive_time_points = np.insert(\n", + " drive_time_points, len(drive_time_points), drive_time_points[-1] + t_ramp_local_detuning\n", + " )\n", "\n", " amplitude_values = np.array(amplitude_values)\n", " amplitude_values = np.insert(amplitude_values, 0, 0.0)\n", @@ -220,30 +223,39 @@ " phase_values = [0 for _ in range(len(drive_time_points))]\n", " detuning_values = [0 for _ in range(len(drive_time_points))]\n", "\n", - " drive = DrivingField.from_lists(drive_time_points, amplitude_values, detuning_values, phase_values)\n", + " drive = DrivingField.from_lists(\n", + " drive_time_points, amplitude_values, detuning_values, phase_values\n", + " )\n", "\n", " pattern = [1 for _ in range(len(register))]\n", " for ind in indices:\n", " pattern[ind] = 0\n", "\n", - " local_detuning_time_points = [0, t_ramp_local_detuning, drive_time_points[-1] - t_ramp_local_detuning, drive_time_points[-1]]\n", + " local_detuning_time_points = [\n", + " 0,\n", + " t_ramp_local_detuning,\n", + " drive_time_points[-1] - t_ramp_local_detuning,\n", + " drive_time_points[-1],\n", + " ]\n", " local_detuning_values = [0, -local_detuning_max, -local_detuning_max, 0]\n", "\n", - " local_detuning = LocalDetuning.from_lists(local_detuning_time_points, local_detuning_values, pattern)\n", + " local_detuning = LocalDetuning.from_lists(\n", + " local_detuning_time_points, local_detuning_values, pattern\n", + " )\n", "\n", - " show_drive_and_local_detuning(drive, local_detuning) \n", + " show_drive_and_local_detuning(drive, local_detuning)\n", "\n", " if run_and_show:\n", " ahs_program = AnalogHamiltonianSimulation(\n", - " hamiltonian=drive + local_detuning,\n", - " register=register\n", + " hamiltonian=drive + local_detuning, register=register\n", " )\n", "\n", " result = simulator.run(ahs_program, shots=1000, steps=30, blockade_radius=6.5e-6).result()\n", " show_final_avg_density(result)\n", - " \n", + "\n", " return drive, local_detuning\n", "\n", + "\n", "indices_ryd = [i for i in range(N) if np.mod(i, 2) == 0 and i != N // 2]\n", "\n", "drive_initial_state, local_detuning_initial_state = prepare_states(indices_ryd)" @@ -283,30 +295,30 @@ "\n", "\n", "for ind_t, t in enumerate(trange):\n", - " \n", " time_points = [0, t_ramp_omega, t_ramp_omega + t, 2 * t_ramp_omega + t]\n", " amplitude_values = [0, omega_max, omega_max, 0]\n", " phase_values = [0, 0, 0, 0]\n", - " detuning_values = [0, 0, 0, 0] \n", + " detuning_values = [0, 0, 0, 0]\n", " local_detuning_values = [0, 0, 0, 0]\n", - " \n", - " drive_propagation = DrivingField.from_lists(time_points, amplitude_values, detuning_values, phase_values)\n", + "\n", + " drive_propagation = DrivingField.from_lists(\n", + " time_points, amplitude_values, detuning_values, phase_values\n", + " )\n", " drive = drive_initial_state.stitch(drive_propagation)\n", - " \n", - " local_detuning_propagation = LocalDetuning.from_lists(time_points, local_detuning_values, local_detuning_initial_state.magnitude.pattern.series)\n", - " local_detuning = local_detuning_initial_state.stitch(local_detuning_propagation) \n", - " \n", + "\n", + " local_detuning_propagation = LocalDetuning.from_lists(\n", + " time_points, local_detuning_values, local_detuning_initial_state.magnitude.pattern.series\n", + " )\n", + " local_detuning = local_detuning_initial_state.stitch(local_detuning_propagation)\n", + "\n", " programs.append(\n", - " AnalogHamiltonianSimulation(\n", - " hamiltonian=drive + local_detuning,\n", - " register=register\n", - " )\n", + " AnalogHamiltonianSimulation(hamiltonian=drive + local_detuning, register=register)\n", " )\n", - " trange2.append(drive.amplitude.time_series.times()[-1]) \n", - " \n", + " trange2.append(drive.amplitude.time_series.times()[-1])\n", + "\n", " # Show an example for the full program\n", " if ind_t == len(trange) // 2:\n", - " show_drive_and_local_detuning(drive, local_detuning)\n" + " show_drive_and_local_detuning(drive, local_detuning)" ] }, { @@ -339,7 +351,7 @@ "for ind, program in enumerate(programs):\n", " result = simulator.run(program, shots=1000, steps=20, blockade_radius=6.5e-6).result()\n", " densities.append(result.get_avg_density())\n", - " \n", + "\n", "print(f\"The elapsed time = {time.time()-start_time} seconds\")" ] }, @@ -361,15 +373,15 @@ } ], "source": [ - "plt.figure(figsize = (4,4))\n", - "shw=plt.imshow(densities[::-1], aspect='auto')\n", + "plt.figure(figsize=(4, 4))\n", + "shw = plt.imshow(densities[::-1], aspect=\"auto\")\n", "plt.xlabel(\"Sites\", fontsize=20)\n", "plt.ylabel(\"Times (microseconds)\", fontsize=20)\n", "plt.yticks(fontsize=20)\n", "plt.xticks(fontsize=20)\n", - "plt.yticks([len(trange2)-1, 0], [\"0\", f\"{ ( trange2[-1] - trange2[0] ) * 1e6}\"[:4]])\n", + "plt.yticks([len(trange2) - 1, 0], [\"0\", f\"{ ( trange2[-1] - trange2[0] ) * 1e6}\"[:4]])\n", "bar = plt.colorbar(shw)\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -407,7 +419,8 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.aws import AwsDevice \n", + "from braket.aws import AwsDevice\n", + "\n", "qpu = AwsDevice(\"arn:aws:braket:us-east-1::device/qpu/quera/Aquila\")" ] }, @@ -421,9 +434,8 @@ "task_arns = []\n", "for ind, program in enumerate(programs):\n", " task = qpu.run(program.discretize(qpu), shots=100)\n", - " task_arn = task.metadata()['quantumTaskArn']\n", - " task_arns.append(task_arn)\n", - " " + " task_arn = task.metadata()[\"quantumTaskArn\"]\n", + " task_arns.append(task_arn)" ] }, { @@ -467,15 +479,15 @@ } ], "source": [ - "plt.figure(figsize = (4,4))\n", - "shw=plt.imshow(densities_qpu[::-1], aspect='auto')\n", + "plt.figure(figsize=(4, 4))\n", + "shw = plt.imshow(densities_qpu[::-1], aspect=\"auto\")\n", "plt.xlabel(\"Sites\", fontsize=20)\n", "plt.ylabel(\"Times (microseconds)\", fontsize=20)\n", "plt.yticks(fontsize=20)\n", "plt.xticks(fontsize=20)\n", - "plt.yticks([len(trange2)-1, 0], [\"0\", f\"{(trange2[-1]-trange2[0])*1e6}\"[:4]])\n", + "plt.yticks([len(trange2) - 1, 0], [\"0\", f\"{(trange2[-1]-trange2[0])*1e6}\"[:4]])\n", "bar = plt.colorbar(shw)\n", - "plt.show()\n" + "plt.show()" ] }, { @@ -508,8 +520,12 @@ "source": [ "print(\"Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set.ipynb b/examples/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set.ipynb index 63edd5867..85a4748a9 100644 --- a/examples/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set.ipynb +++ b/examples/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set.ipynb @@ -2,6 +2,7 @@ "cells": [ { "cell_type": "markdown", + "id": "7fb27b941602401d91542211134fc71a", "metadata": { "pycharm": { "name": "#%% md\n" @@ -64,6 +65,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -74,19 +76,15 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.ahs.hamiltonian import Hamiltonian\n", - "from braket.ahs.atom_arrangement import AtomArrangement\n", + "import numpy as np\n", + "from ahs_utils import show_drive_and_local_detuning, show_final_avg_density, show_register\n", + "\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.driving_field import DrivingField\n", "from braket.ahs.local_detuning import LocalDetuning\n", - "\n", - "\n", - "from ahs_utils import show_register, show_drive_and_local_detuning, show_final_avg_density\n", - "\n", - "import numpy as np\n", - "import matplotlib.pylab as plt\n", - "\n", "from braket.devices import LocalSimulator\n", + "\n", "simulator = LocalSimulator(\"braket_ahs\")" ] }, @@ -105,17 +103,17 @@ "metadata": {}, "outputs": [], "source": [ - "omega_max = 15800000.0 # rad / seconds\n", - "omega_slew_rate_max = 250000000000000.0 # rad / seconds / seconds\n", - "tmin = 5e-08 # seconds\n", + "omega_max = 15800000.0 # rad / seconds\n", + "omega_slew_rate_max = 250000000000000.0 # rad / seconds / seconds\n", + "tmin = 5e-08 # seconds\n", "\n", - "local_detuning_max = (2*np.pi*7.5)*1e6 # rad / seconds\n", - "local_detuning_slew_rate_max = (2*np.pi*7.5)*1e12 # rad / seconds / seconds\n", + "local_detuning_max = (2 * np.pi * 7.5) * 1e6 # rad / seconds\n", + "local_detuning_slew_rate_max = (2 * np.pi * 7.5) * 1e12 # rad / seconds / seconds\n", "\n", - "t_ramp_omega = omega_max/omega_slew_rate_max # seconds\n", - "t_ramp_local_detuning = local_detuning_max/local_detuning_slew_rate_max # seconds\n", + "t_ramp_omega = omega_max / omega_slew_rate_max # seconds\n", + "t_ramp_local_detuning = local_detuning_max / local_detuning_slew_rate_max # seconds\n", "\n", - "detuning_max = 125000000.0 # rad / seconds" + "detuning_max = 125000000.0 # rad / seconds" ] }, { @@ -151,8 +149,8 @@ "\n", "for i in range(3):\n", " for j in range(3):\n", - " register.add([i * a, (3-j) * a])\n", - " \n", + " register.add([i * a, (3 - j) * a])\n", + "\n", "show_register(register)" ] }, @@ -184,38 +182,52 @@ } ], "source": [ - "weights = [0.26, 0.13, 0.93, 0.95, 0.23, 0.20, 0.05, 0.96, 0.01] # Weights for the vertices in the graph\n", + "weights = [\n", + " 0.26,\n", + " 0.13,\n", + " 0.93,\n", + " 0.95,\n", + " 0.23,\n", + " 0.20,\n", + " 0.05,\n", + " 0.96,\n", + " 0.01,\n", + "] # Weights for the vertices in the graph\n", "\n", "t_max = 3.8e-6\n", "\n", "\n", - "time_points = [0, t_ramp_omega, t_max - t_ramp_local_detuning - t_ramp_omega, t_max - t_ramp_local_detuning, t_max]\n", + "time_points = [\n", + " 0,\n", + " t_ramp_omega,\n", + " t_max - t_ramp_local_detuning - t_ramp_omega,\n", + " t_max - t_ramp_local_detuning,\n", + " t_max,\n", + "]\n", "amplitude_values = [0, omega_max, omega_max, 0, 0]\n", "\n", "phase_values = [0 for _ in range(len(time_points))]\n", - "detuning_0 = -detuning_max/12\n", + "detuning_0 = -detuning_max / 12\n", "\n", - "detuning_slew_rate = local_detuning_max/(t_max - t_ramp_local_detuning)\n", - "detuning_values = [detuning_0, \n", - " detuning_0 + detuning_slew_rate * t_ramp_omega,\n", - " detuning_0 + detuning_slew_rate * (t_max - t_ramp_local_detuning - t_ramp_omega),\n", - " detuning_0 + detuning_slew_rate * (t_max - t_ramp_local_detuning),\n", - " detuning_0 + detuning_slew_rate * (t_max - t_ramp_local_detuning)\n", - " ]\n", + "detuning_slew_rate = local_detuning_max / (t_max - t_ramp_local_detuning)\n", + "detuning_values = [\n", + " detuning_0,\n", + " detuning_0 + detuning_slew_rate * t_ramp_omega,\n", + " detuning_0 + detuning_slew_rate * (t_max - t_ramp_local_detuning - t_ramp_omega),\n", + " detuning_0 + detuning_slew_rate * (t_max - t_ramp_local_detuning),\n", + " detuning_0 + detuning_slew_rate * (t_max - t_ramp_local_detuning),\n", + "]\n", "\n", "drive = DrivingField.from_lists(time_points, amplitude_values, detuning_values, phase_values)\n", "\n", "time_local_detuning = [0, t_max - t_ramp_local_detuning, t_max]\n", "value_local_detuning = [0, -local_detuning_max, 0]\n", "\n", - "pattern = [np.round(1-w, 2) for w in weights]\n", + "pattern = [np.round(1 - w, 2) for w in weights]\n", "local_detuning = LocalDetuning.from_lists(time_local_detuning, value_local_detuning, pattern)\n", "\n", "\n", - "program = AnalogHamiltonianSimulation(\n", - " hamiltonian=drive + local_detuning,\n", - " register=register\n", - ")\n", + "program = AnalogHamiltonianSimulation(hamiltonian=drive + local_detuning, register=register)\n", "\n", "show_drive_and_local_detuning(drive, local_detuning)" ] @@ -246,7 +258,7 @@ } ], "source": [ - "result = simulator.run(program, shots=1000, steps = 30, blockade_radius=7.9e-6).result()\n", + "result = simulator.run(program, shots=1000, steps=30, blockade_radius=7.9e-6).result()\n", "show_final_avg_density(result)" ] }, @@ -277,7 +289,10 @@ "source": [ "def get_counters_from_result(result):\n", " post_sequences = [list(measurement.post_sequence) for measurement in result.measurements]\n", - " post_sequences = [\"\".join(['r' if site==0 else 'g' for site in post_sequence]) for post_sequence in post_sequences]\n", + " post_sequences = [\n", + " \"\".join([\"r\" if site == 0 else \"g\" for site in post_sequence])\n", + " for post_sequence in post_sequences\n", + " ]\n", "\n", " counters = {}\n", " for post_sequence in post_sequences:\n", @@ -287,6 +302,7 @@ " counters[post_sequence] = 1\n", " return counters\n", "\n", + "\n", "counters = get_counters_from_result(result)\n", "sorted_counters = sorted(counters.items(), key=lambda x: -x[1])\n", "\n", @@ -294,7 +310,9 @@ "config_largest_prob = sorted_counters[0][0]\n", "largest_prob = sorted_counters[0][1] / sum([item[1] for item in sorted_counters])\n", "\n", - "print(f\"The configuration with largeset probability reads {config_largest_prob} with probability {largest_prob}\")\n" + "print(\n", + " f\"The configuration with largeset probability reads {config_largest_prob} with probability {largest_prob}\"\n", + ")" ] }, { @@ -320,7 +338,8 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.aws import AwsDevice \n", + "from braket.aws import AwsDevice\n", + "\n", "qpu = AwsDevice(\"arn:aws:braket:us-east-1::device/qpu/quera/Aquila\")" ] }, @@ -341,7 +360,7 @@ "source": [ "task = qpu.run(program.discretize(qpu), shots=1000)\n", "metadata = task.metadata()\n", - "task_arn = metadata['quantumTaskArn']\n", + "task_arn = metadata[\"quantumTaskArn\"]\n", "print(f\"ARN: {task_arn}\")" ] }, @@ -397,9 +416,11 @@ "sorted_counters_qpu = sorted(counters_qpu.items(), key=lambda x: -x[1])\n", "\n", "config_largest_prob_qpu = sorted_counters_qpu[0][0]\n", - "largest_prob_qpu = sorted_counters_qpu[0][1]/sum([item[1] for item in sorted_counters_qpu])\n", + "largest_prob_qpu = sorted_counters_qpu[0][1] / sum([item[1] for item in sorted_counters_qpu])\n", "\n", - "print(f\"The configuration with largeset probability reads {config_largest_prob_qpu} with probability {largest_prob_qpu}\")" + "print(\n", + " f\"The configuration with largeset probability reads {config_largest_prob_qpu} with probability {largest_prob_qpu}\"\n", + ")" ] }, { @@ -432,8 +453,12 @@ "source": [ "print(\"Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays.ipynb b/examples/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays.ipynb index 347a9fc82..0f04e5e73 100644 --- a/examples/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays.ipynb +++ b/examples/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays.ipynb @@ -77,6 +77,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "tracker = Tracker().start()" ] }, @@ -117,7 +118,8 @@ ], "source": [ "from pprint import pprint as pp\n", - "from braket.aws import AwsDevice \n", + "\n", + "from braket.aws import AwsDevice\n", "\n", "qpu = AwsDevice(\"arn:aws:braket:us-east-1::device/qpu/quera/Aquila\")\n", "capabilities = qpu.properties.paradigm\n", @@ -142,9 +144,10 @@ }, "outputs": [], "source": [ - "from braket.ahs.atom_arrangement import AtomArrangement\n", + "from ahs_utils import show_drive_and_local_detuning, show_global_drive\n", + "\n", "from braket.ahs.analog_hamiltonian_simulation import AnalogHamiltonianSimulation\n", - "from ahs_utils import show_global_drive, show_register, show_drive_and_local_detuning\n", + "from braket.ahs.atom_arrangement import AtomArrangement\n", "from braket.ahs.driving_field import DrivingField\n", "from braket.timings.time_series import TimeSeries\n", "\n", @@ -158,7 +161,7 @@ "\n", "\n", "def create_evolve_bell_states(\n", - " atom_separation: float = 6.7e-6, # The separation of the two atoms used throughout the notebook\n", + " atom_separation: float = 6.7e-6, # The separation of the two atoms used throughout the notebook\n", " amplitude_area: float = 0.0,\n", " if_show_global_drive: bool = False,\n", " if_parallel: bool = False,\n", @@ -177,12 +180,12 @@ "\n", " Returns:\n", " (AnalogHamiltonianSimulation): The AHS program for creating and evolving a Bell state\n", - " \"\"\" \n", - " \n", - " detuning_max = C6/(atom_separation**6)\n", + " \"\"\"\n", + "\n", + " detuning_max = C6 / (atom_separation**6)\n", " t_ramp_detuning = detuning_max / detuning_slew_rate\n", " t_ramp_detuning = max(t_ramp_detuning, time_separation_min)\n", - " \n", + "\n", " # Define register\n", " coords = [(0, 0), (0, atom_separation)]\n", " if if_parallel:\n", @@ -190,54 +193,60 @@ " n_height = int(height // (atom_separation + patch_separation))\n", " if n_height * (atom_separation + patch_separation) + atom_separation < height:\n", " n_height += 1\n", - " \n", - " for i in range(n_height-1):\n", - " coords.append((0, patch_separation * (i+1)))\n", - " coords.append((0, atom_separation + patch_separation * (i+1)))\n", - " \n", + "\n", + " for i in range(n_height - 1):\n", + " coords.append((0, patch_separation * (i + 1)))\n", + " coords.append((0, atom_separation + patch_separation * (i + 1)))\n", + "\n", " # Extend along x direction\n", " n_width = int(width // patch_separation)\n", " if n_width * patch_separation < width:\n", " n_width += 1\n", - " \n", - " for i in range(n_width-1):\n", + "\n", + " for i in range(n_width - 1):\n", " for j in range(n_height):\n", - " coords.append((patch_separation * (i+1), patch_separation * j))\n", - " coords.append((patch_separation * (i+1), atom_separation + patch_separation * j))\n", - " \n", + " coords.append((patch_separation * (i + 1), patch_separation * j))\n", + " coords.append((patch_separation * (i + 1), atom_separation + patch_separation * j))\n", + "\n", " register = AtomArrangement()\n", " for coord in coords:\n", " register.add(coord)\n", "\n", " # Prepare the Bell state\n", - " amplitude = TimeSeries.trapezoidal_signal(np.pi/np.sqrt(2), amplitude_max, amplitude_slew_rate, time_separation_min=time_separation_min)\n", + " amplitude = TimeSeries.trapezoidal_signal(\n", + " np.pi / np.sqrt(2),\n", + " amplitude_max,\n", + " amplitude_slew_rate,\n", + " time_separation_min=time_separation_min,\n", + " )\n", " detuning = TimeSeries.constant_like(amplitude, 0.0)\n", " phase = TimeSeries.constant_like(amplitude, 0.0)\n", - " \n", + "\n", " # Ramp up the detuning\n", " t_prep = amplitude.times()[-1]\n", " amplitude.put(t_prep + t_ramp_detuning, 0.0)\n", " detuning.put(t_prep + t_ramp_detuning, detuning_max)\n", " phase.put(t_prep + t_ramp_detuning, 0.0)\n", - " \n", + "\n", " # Evolve\n", " if amplitude_area > 0:\n", - " amplitude_evolve = TimeSeries.trapezoidal_signal(amplitude_area, amplitude_max, amplitude_slew_rate, time_separation_min=time_separation_min)\n", + " amplitude_evolve = TimeSeries.trapezoidal_signal(\n", + " amplitude_area,\n", + " amplitude_max,\n", + " amplitude_slew_rate,\n", + " time_separation_min=time_separation_min,\n", + " )\n", " amplitude = amplitude.stitch(amplitude_evolve)\n", " detuning = detuning.stitch(TimeSeries.constant_like(amplitude_evolve, detuning_max))\n", " phase = phase.stitch(TimeSeries.constant_like(amplitude_evolve, 0.0))\n", - " \n", - " \n", + "\n", " drive = DrivingField(amplitude=amplitude, phase=phase, detuning=detuning)\n", - " \n", + "\n", " if if_show_global_drive:\n", " show_global_drive(drive)\n", - " \n", - " program = AnalogHamiltonianSimulation(\n", - " register = register,\n", - " hamiltonian = drive\n", - " )\n", - " \n", + "\n", + " program = AnalogHamiltonianSimulation(register=register, hamiltonian=drive)\n", + "\n", " return program" ] }, @@ -271,7 +280,7 @@ "source": [ "import numpy as np\n", "\n", - "create_evolve_bell_states(amplitude_area = np.pi/np.sqrt(2), if_show_global_drive=True) ;" + "create_evolve_bell_states(amplitude_area=np.pi / np.sqrt(2), if_show_global_drive=True);" ] }, { @@ -315,9 +324,11 @@ ], "source": [ "%%time \n", - "n_times=19\n", - "amplitude_areas = [np.pi/24 * i for i in range(n_times)]\n", - "programs = [create_evolve_bell_states(amplitude_area = amplitude_area) for amplitude_area in amplitude_areas]\n", + "n_times = 19\n", + "amplitude_areas = [np.pi / 24 * i for i in range(n_times)]\n", + "programs = [\n", + " create_evolve_bell_states(amplitude_area=amplitude_area) for amplitude_area in amplitude_areas\n", + "]\n", "results = [simulator.run(program, shots=1000, steps=100).result() for program in programs]\n", "counters = [result.get_counts() for result in results]" ] @@ -352,9 +363,10 @@ "source": [ "import matplotlib.pyplot as plt\n", "\n", + "\n", "def compare_results(\n", - " counters_list: list[list[dict[str, int]]], \n", - " labels: list[str], \n", + " counters_list: list[list[dict[str, int]]],\n", + " labels: list[str],\n", ") -> None:\n", " \"\"\"\n", " Compare a list of labeled simulation results with theory expectation for Bell state evolution\n", @@ -367,70 +379,106 @@ "\n", " for counters in counters_list:\n", " for counter in counters:\n", - " for key in ['rr', 'gg', 'rg', 'gr']:\n", + " for key in [\"rr\", \"gg\", \"rg\", \"gr\"]:\n", " if key not in counter.keys():\n", " counter[key] = 0\n", - " \n", - " fig, axes = plt.subplots(1, 2, figsize = (20, 6))\n", - " colors = ['b', 'm', 'g', 'orange', 'r']\n", + "\n", + " _fig, axes = plt.subplots(1, 2, figsize=(20, 6))\n", + " colors = [\"b\", \"m\", \"g\", \"orange\", \"r\"]\n", " markers = [\"o\", \"x\"]\n", " markersize = 4\n", "\n", - " axes[0].plot(amplitude_areas, [np.sin(area/np.sqrt(2))**2 for area in amplitude_areas], '-', c=colors[0], label='rr (theory)')\n", - " axes[0].plot(amplitude_areas, [np.cos(area/np.sqrt(2))**2 for area in amplitude_areas], '-', c=colors[-1], label='gr+rg (theory)')\n", + " axes[0].plot(\n", + " amplitude_areas,\n", + " [np.sin(area / np.sqrt(2)) ** 2 for area in amplitude_areas],\n", + " \"-\",\n", + " c=colors[0],\n", + " label=\"rr (theory)\",\n", + " )\n", + " axes[0].plot(\n", + " amplitude_areas,\n", + " [np.cos(area / np.sqrt(2)) ** 2 for area in amplitude_areas],\n", + " \"-\",\n", + " c=colors[-1],\n", + " label=\"gr+rg (theory)\",\n", + " )\n", "\n", " def plot_ax(ax, xs, ys, marker, color, shots, label=\"\"):\n", - " yerr = [2 * np.sqrt(y * (1-y) / (shots+1)) for y in ys]\n", + " yerr = [2 * np.sqrt(y * (1 - y) / (shots + 1)) for y in ys]\n", " ax.errorbar(xs, ys, yerr=yerr, fmt=marker, color=color, label=label, markersize=markersize)\n", - " \n", + "\n", " for counters, label, marker in zip(counters_list, labels, markers):\n", " shots = sum(counters[0].values())\n", - " plot_ax(axes[0], \n", - " amplitude_areas,\n", - " [item['rr']/shots for item in counters],\n", - " marker,\n", - " colors[0],\n", - " shots,\n", - " label=f'rr ({label})'\n", - " )\n", - " \n", - " plot_ax(axes[0], \n", - " amplitude_areas,\n", - " [(item['gr']+item['rg'])/shots for item in counters], \n", - " marker,\n", - " colors[-1],\n", - " shots,\n", - " label=f'gr+rg ({label})'\n", - " ) \n", - " \n", + " plot_ax(\n", + " axes[0],\n", + " amplitude_areas,\n", + " [item[\"rr\"] / shots for item in counters],\n", + " marker,\n", + " colors[0],\n", + " shots,\n", + " label=f\"rr ({label})\",\n", + " )\n", + "\n", + " plot_ax(\n", + " axes[0],\n", + " amplitude_areas,\n", + " [(item[\"gr\"] + item[\"rg\"]) / shots for item in counters],\n", + " marker,\n", + " colors[-1],\n", + " shots,\n", + " label=f\"gr+rg ({label})\",\n", + " )\n", + "\n", " axes[0].legend()\n", " axes[0].set_xlabel(\"Amplitude area (rad)\")\n", " axes[0].set_ylabel(\"State prob. \")\n", - " \n", - " axes[1].plot(amplitude_areas, [np.sin(area/np.sqrt(2))**2 for area in amplitude_areas], '-', c=colors[0], label='rr (theory)')\n", - " axes[1].plot(amplitude_areas, [0 for _ in amplitude_areas], '-', c=colors[1], label='gg (theory)')\n", - " axes[1].plot(amplitude_areas, [np.cos(area/np.sqrt(2))**2/2 for area in amplitude_areas], '-', c=colors[2], label='rg (theory)')\n", - " axes[1].plot(amplitude_areas, [np.cos(area/np.sqrt(2))**2/2 for area in amplitude_areas], '-', c=colors[3], label='gr (theory)')\n", "\n", - " for counters, label, marker in zip(counters_list, labels, markers): \n", + " axes[1].plot(\n", + " amplitude_areas,\n", + " [np.sin(area / np.sqrt(2)) ** 2 for area in amplitude_areas],\n", + " \"-\",\n", + " c=colors[0],\n", + " label=\"rr (theory)\",\n", + " )\n", + " axes[1].plot(\n", + " amplitude_areas, [0 for _ in amplitude_areas], \"-\", c=colors[1], label=\"gg (theory)\"\n", + " )\n", + " axes[1].plot(\n", + " amplitude_areas,\n", + " [np.cos(area / np.sqrt(2)) ** 2 / 2 for area in amplitude_areas],\n", + " \"-\",\n", + " c=colors[2],\n", + " label=\"rg (theory)\",\n", + " )\n", + " axes[1].plot(\n", + " amplitude_areas,\n", + " [np.cos(area / np.sqrt(2)) ** 2 / 2 for area in amplitude_areas],\n", + " \"-\",\n", + " c=colors[3],\n", + " label=\"gr (theory)\",\n", + " )\n", + "\n", + " for counters, label, marker in zip(counters_list, labels, markers):\n", " shots = sum(counters[0].values())\n", - " for state, color in zip(['rr', 'gg', 'rg', 'gr'], colors):\n", - " plot_ax(axes[1],\n", - " amplitude_areas, \n", - " [item[state]/shots for item in counters], \n", - " marker,\n", - " color,\n", - " shots,\n", - " label=f'{state} ({label})'\n", - " )\n", - " \n", - " axes[1].legend(loc = \"upper left\")\n", + " for state, color in zip([\"rr\", \"gg\", \"rg\", \"gr\"], colors):\n", + " plot_ax(\n", + " axes[1],\n", + " amplitude_areas,\n", + " [item[state] / shots for item in counters],\n", + " marker,\n", + " color,\n", + " shots,\n", + " label=f\"{state} ({label})\",\n", + " )\n", + "\n", + " axes[1].legend(loc=\"upper left\")\n", " axes[1].set_xlabel(\"Amplitude area (rad)\")\n", " axes[1].set_ylabel(\"State prob. \")\n", "\n", " plt.show()\n", "\n", - "compare_results([counters], [\"noiseless simulation\"])\n" + "\n", + "compare_results([counters], [\"noiseless simulation\"])" ] }, { @@ -530,8 +578,7 @@ "outputs": [], "source": [ "def apply_site_position_error(\n", - " sites: list[list[float]], \n", - " site_position_error: float\n", + " sites: list[list[float]], site_position_error: float\n", ") -> list[np.ndarray]:\n", " \"\"\"\n", " Apply site position error to a list of 2D coordinates\n", @@ -547,7 +594,7 @@ " erroneous_sites = []\n", " for site in sites:\n", " erroneous_sites.append(site + site_position_error * np.random.normal(size=2))\n", - " \n", + "\n", " return erroneous_sites" ] }, @@ -607,7 +654,7 @@ " arr (list[int]): An noiseless array\n", " p01 (float): The probability of mistakenly switching 0 as 1\n", " p10 (float): The probability of mistakenly switching 1 as 0\n", - " \n", + "\n", " Returns:\n", " noisy_arr (list[int]): The noisy array\n", " \"\"\"\n", @@ -619,7 +666,7 @@ " else:\n", " # Apply the error of switching 0 as 1\n", " noisy_arr.append(np.random.binomial(1, p01))\n", - " \n", + "\n", " return noisy_arr" ] }, @@ -652,28 +699,30 @@ "num_trial = 0\n", "while True:\n", " erroneous_filling = apply_binomial_noise(\n", - " [0, 1], \n", + " [0, 1],\n", " float(performance.lattice.fillingErrorTypical),\n", - " float(performance.lattice.vacancyErrorTypical)\n", + " float(performance.lattice.vacancyErrorTypical),\n", " )\n", " if erroneous_filling != [0, 1]:\n", " print(f\"An erroreous filling is found after {num_trial} trials.\")\n", " break\n", " else:\n", " num_trial += 1\n", - " \n", + "\n", "num_trial = 0\n", "while True:\n", " pre_seq = apply_binomial_noise(\n", - " [0, 1], \n", + " [0, 1],\n", " float(performance.lattice.atomDetectionErrorFalseNegativeTypical),\n", - " float(performance.lattice.atomDetectionErrorFalsePositiveTypical)\n", + " float(performance.lattice.atomDetectionErrorFalsePositiveTypical),\n", " )\n", " if pre_seq != [0, 1]:\n", - " print(f\"A pre sequence is found to be different from the given filling after {num_trial} trials.\")\n", + " print(\n", + " f\"A pre sequence is found to be different from the given filling after {num_trial} trials.\"\n", + " )\n", " break\n", " else:\n", - " num_trial += 1 " + " num_trial += 1" ] }, { @@ -699,30 +748,25 @@ "source": [ "from braket.device_schema.quera.quera_ahs_paradigm_properties_v1 import Performance\n", "\n", + "\n", "def apply_lattice_initialization_errors(\n", - " program: AnalogHamiltonianSimulation,\n", - " performance: Performance, \n", - " typical_error: bool = True\n", - ") -> tuple[\n", - " list[list[float]], \n", - " list[int],\n", - " list[int]\n", - "]:\n", + " program: AnalogHamiltonianSimulation, performance: Performance, typical_error: bool = True\n", + ") -> tuple[list[list[float]], list[int], list[int]]:\n", " \"\"\"\n", " Apply noises for initializing the atomic lattice\n", "\n", " Args:\n", " program (AnalogHamiltonianSimulation): An AHS program\n", " performance (Performance): The parameters determining the limitations of the Rydberg device\n", - " typical_error (bool): If true, apply the typical values for the parameters, otherwise, apply \n", + " typical_error (bool): If true, apply the typical values for the parameters, otherwise, apply\n", " the worst-case values for the parameters. Default True.\n", - " \n", + "\n", " Returns:\n", " erroneous_sites (list[list[float]]): A list of 2D erroneous coordinates\n", " erroneous_filling (list[int]): A list of erroneous filling\n", " pre_seq (list[int]): The pre-sequence\n", " \"\"\"\n", - " \n", + "\n", " site_position_err = float(performance.lattice.sitePositionError)\n", " ground_prep_err = float(performance.rydberg.rydbergGlobal.groundPrepError)\n", " if typical_error:\n", @@ -734,18 +778,23 @@ " filling_err = float(performance.lattice.vacancyErrorWorst)\n", " vacancy_err = float(performance.lattice.vacancyErrorWorst)\n", " atom_det_false_positive = float(performance.lattice.atomDetectionErrorFalsePositiveWorst)\n", - " atom_det_false_negative = float(performance.lattice.atomDetectionErrorFalseNegativeWorst) \n", - " \n", - " sites = [[x, y] for (x, y) in zip(program.register.coordinate_list(0), program.register.coordinate_list(1))]\n", + " atom_det_false_negative = float(performance.lattice.atomDetectionErrorFalseNegativeWorst)\n", + "\n", + " sites = [\n", + " [x, y]\n", + " for (x, y) in zip(program.register.coordinate_list(0), program.register.coordinate_list(1))\n", + " ]\n", " filling = program.to_ir().setup.ahs_register.filling\n", - " \n", + "\n", " erroneous_sites = apply_site_position_error(sites, site_position_err)\n", " erroneous_filling = apply_binomial_noise(filling, filling_err, vacancy_err)\n", - " pre_seq = apply_binomial_noise(erroneous_filling, atom_det_false_negative, atom_det_false_positive)\n", + " pre_seq = apply_binomial_noise(\n", + " erroneous_filling, atom_det_false_negative, atom_det_false_positive\n", + " )\n", "\n", " erroneous_filling = apply_binomial_noise(erroneous_filling, 0, ground_prep_err)\n", - " \n", - " return erroneous_sites, erroneous_filling, pre_seq " + "\n", + " return erroneous_sites, erroneous_filling, pre_seq" ] }, { @@ -802,12 +851,13 @@ "source": [ "import scipy\n", "\n", + "\n", "def apply_amplitude_errors(\n", " amplitude: TimeSeries,\n", " steps: int,\n", " rabi_error_rel: float,\n", " rabi_ramp_correction: list,\n", - " amplitude_max = amplitude_max\n", + " amplitude_max=amplitude_max,\n", ") -> TimeSeries:\n", " \"\"\"\n", " Apply noises to the amplitude\n", @@ -816,76 +866,78 @@ " amplitude (TimeSeries): The time series for the amplitude\n", " steps (int): The number of time steps in the simulation\n", " rabi_error_rel (float): The amplitude error as a relative value\n", - " rabi_ramp_correction (list): The dynamic correction to ramped amplitude \n", + " rabi_ramp_correction (list): The dynamic correction to ramped amplitude\n", " as relative values\n", - " \n", + "\n", " Returns:\n", " noisy_amplitude (TimeSeries): The time series of the noisy amplitude\n", - " \"\"\" \n", - " \n", + " \"\"\"\n", + "\n", " amplitude_times = amplitude.time_series.times()\n", " amplitude_values = amplitude.time_series.values()\n", - " \n", + "\n", " # Rewrite the rabi_ramp_correction as a function of slopes\n", - " rabi_ramp_correction_slopes = [amplitude_max / float(corr.rampTime)\n", - " for corr in rabi_ramp_correction\n", + " rabi_ramp_correction_slopes = [\n", + " amplitude_max / float(corr.rampTime) for corr in rabi_ramp_correction\n", " ]\n", - " rabi_ramp_correction_fracs = [float(corr.rabiCorrection)\n", - " for corr in rabi_ramp_correction\n", - " ] \n", + " rabi_ramp_correction_fracs = [float(corr.rabiCorrection) for corr in rabi_ramp_correction]\n", " rabi_ramp_correction_slopes = rabi_ramp_correction_slopes[::-1]\n", " rabi_ramp_correction_fracs = rabi_ramp_correction_fracs[::-1]\n", - " \n", + "\n", " # Helper function to find the correction factor for a given slope\n", - " get_frac = scipy.interpolate.interp1d(rabi_ramp_correction_slopes, \n", - " rabi_ramp_correction_fracs, \n", - " bounds_error=False, \n", - " fill_value=\"extrapolate\"\n", - " )\n", - " \n", + " get_frac = scipy.interpolate.interp1d(\n", + " rabi_ramp_correction_slopes,\n", + " rabi_ramp_correction_fracs,\n", + " bounds_error=False,\n", + " fill_value=\"extrapolate\",\n", + " )\n", + "\n", " noisy_amplitude_times = np.linspace(0, amplitude_times[-1], steps)\n", " noisy_amplitude_values = []\n", - " \n", + "\n", " # First apply the rabi ramp correction\n", " for ind in range(len(amplitude_times)):\n", " if ind == 0:\n", " continue\n", - " \n", + "\n", " # First determine the correction factor from the slope\n", - " t1, t2 = amplitude_times[ind-1], amplitude_times[ind]\n", - " v1, v2 = amplitude_values[ind-1], amplitude_values[ind]\n", + " t1, t2 = amplitude_times[ind - 1], amplitude_times[ind]\n", + " v1, v2 = amplitude_values[ind - 1], amplitude_values[ind]\n", " slope = (v2 - v1) / (t2 - t1)\n", " if np.abs(slope) > 0:\n", - " frac = get_frac(np.abs(slope)) * np.sign(slope) \n", + " frac = get_frac(np.abs(slope)) * np.sign(slope)\n", " else:\n", " frac = 1.0\n", - " \n", + "\n", " # Next, determine the coefficients for the quadratic correction\n", " if frac >= 1.0:\n", " a, b, c = 0, 0, v2\n", " else:\n", " # Determine the coefficients for the quadratic correction\n", - " # of the form f(t) = a*t^2 + b * t + c \n", - " # such that f(t1) = v1 and f(t2) = v2 and \n", + " # of the form f(t) = a*t^2 + b * t + c\n", + " # such that f(t1) = v1 and f(t2) = v2 and\n", " # a/3*(t2^3-t1^3) + b/2*(t2^2-t1^2) + c(t2-t1) = frac * (t2-t1) * (v2-v1)/2\n", - " \n", - " a = 3 * (v1 + frac * v1 + v2 - frac * v2)/(t1 - t2)**2\n", - " c = (t2 * v1 * ((2 + 3 * frac) * t1 + t2) + t1 * v2 * (t1 + (2 - 3 * frac) * t2))/(t1 - t2)**2\n", - " b = (v2 - c - a * t2**2) / t2 \n", - " \n", + "\n", + " a = 3 * (v1 + frac * v1 + v2 - frac * v2) / (t1 - t2) ** 2\n", + " c = (t2 * v1 * ((2 + 3 * frac) * t1 + t2) + t1 * v2 * (t1 + (2 - 3 * frac) * t2)) / (\n", + " t1 - t2\n", + " ) ** 2\n", + " b = (v2 - c - a * t2**2) / t2\n", + "\n", " # Finally, put values into noisy_amplitude_values\n", " for t in noisy_amplitude_times:\n", " if t1 <= t and t <= t2:\n", " noisy_amplitude_values.append(a * t**2 + b * t + c)\n", "\n", - " \n", " # Next apply amplitude error\n", " rabi_errors = 1 + rabi_error_rel * np.random.normal(size=len(noisy_amplitude_values))\n", " noisy_amplitude_values = np.multiply(noisy_amplitude_values, rabi_errors)\n", - " noisy_amplitude_values = [max(0, value) for value in noisy_amplitude_values] # amplitude has to be non-negative\n", - " \n", + " noisy_amplitude_values = [\n", + " max(0, value) for value in noisy_amplitude_values\n", + " ] # amplitude has to be non-negative\n", + "\n", " noisy_amplitude = TimeSeries.from_lists(noisy_amplitude_times, noisy_amplitude_values)\n", - " \n", + "\n", " return noisy_amplitude" ] }, @@ -907,8 +959,8 @@ "outputs": [], "source": [ "from braket.ahs.field import Field\n", - "from braket.ahs.pattern import Pattern\n", "from braket.ahs.local_detuning import LocalDetuning\n", + "from braket.ahs.pattern import Pattern\n", "\n", "\n", "def apply_detuning_errors(\n", @@ -916,7 +968,7 @@ " filling: list[int],\n", " steps: int,\n", " detuning_error: float,\n", - " detuning_inhomogeneity: float\n", + " detuning_inhomogeneity: float,\n", ") -> tuple[TimeSeries, LocalDetuning]:\n", " \"\"\"\n", " Apply noises to the detuning\n", @@ -927,39 +979,32 @@ " steps (int): The number of time steps in the simulation\n", " detuning_error (float): The detuning error\n", " detuning_inhomogeneity (float): The detuning inhomogeneity\n", - " \n", + "\n", " Returns:\n", " noisy_detuning (TimeSeries): The time series of the noisy detuning\n", " local_detuning (LocalDetuning): The local detuning used to simulate the detuning inhomogeneity\n", - " \"\"\" \n", - " \n", + " \"\"\"\n", + "\n", " detuning_times = detuning.time_series.times()\n", " detuning_values = detuning.time_series.values()\n", - " \n", + "\n", " noisy_detuning_times = np.linspace(0, detuning_times[-1], steps)\n", " noisy_detuning_values = np.interp(noisy_detuning_times, detuning_times, detuning_values)\n", "\n", " # Apply the detuning error\n", " noisy_detuning_values += detuning_error * np.random.normal(size=len(noisy_detuning_values))\n", - " \n", + "\n", " noisy_detuning = TimeSeries.from_lists(noisy_detuning_times, noisy_detuning_values)\n", - " \n", - " # Apply detuning inhomogeneity \n", + "\n", + " # Apply detuning inhomogeneity\n", " h = Pattern([np.random.rand() for _ in filling])\n", - " detuning_local = TimeSeries.from_lists(noisy_detuning_times, \n", - " detuning_inhomogeneity * np.ones(\n", - " len(noisy_detuning_times)\n", - " )\n", - " )\n", + " detuning_local = TimeSeries.from_lists(\n", + " noisy_detuning_times, detuning_inhomogeneity * np.ones(len(noisy_detuning_times))\n", + " )\n", "\n", " # Assemble the local detuning\n", - " local_detuning = LocalDetuning(\n", - " magnitude=Field(\n", - " time_series=detuning_local,\n", - " pattern=h\n", - " )\n", - " )\n", - " \n", + " local_detuning = LocalDetuning(magnitude=Field(time_series=detuning_local, pattern=h))\n", + "\n", " return noisy_detuning, local_detuning" ] }, @@ -992,36 +1037,34 @@ " program (AnalogHamiltonianSimulation): The given AHS program\n", " performance (Performance): The parameters determining the limitations of the Rydberg device\n", " steps (int): The number of time steps in the simulation\n", - " \n", + "\n", " Returns:\n", " noisy_drive (TimeSeries): The noisy global driving field\n", " local_detuning (LocalDetuning): The local detuning used to simulate the detuning inhomogeneity\n", - " \"\"\" \n", - " \n", + " \"\"\"\n", + "\n", " detuning_error = float(performance.rydberg.rydbergGlobal.detuningError)\n", " detuning_inhomogeneity = float(performance.rydberg.rydbergGlobal.detuningInhomogeneity)\n", - " \n", - " noisy_detuning, local_detuning = apply_detuning_errors(program.hamiltonian.detuning,\n", - " program.to_ir().setup.ahs_register.filling,\n", - " steps, \n", - " detuning_error, \n", - " detuning_inhomogeneity\n", - " ) \n", - " \n", + "\n", + " noisy_detuning, local_detuning = apply_detuning_errors(\n", + " program.hamiltonian.detuning,\n", + " program.to_ir().setup.ahs_register.filling,\n", + " steps,\n", + " detuning_error,\n", + " detuning_inhomogeneity,\n", + " )\n", + "\n", " rabi_error_rel = float(performance.rydberg.rydbergGlobal.rabiFrequencyGlobalErrorRel)\n", " rabi_ramp_correction = performance.rydberg.rydbergGlobal.rabiAmplitudeRampCorrection\n", - " noisy_amplitude = apply_amplitude_errors(program.hamiltonian.amplitude,\n", - " steps,\n", - " rabi_error_rel,\n", - " rabi_ramp_correction\n", - " )\n", - " \n", - " noisy_drive = DrivingField(amplitude = noisy_amplitude, \n", - " detuning = noisy_detuning,\n", - " phase = program.hamiltonian.phase\n", - " )\n", - " \n", - " return noisy_drive, local_detuning\n" + " noisy_amplitude = apply_amplitude_errors(\n", + " program.hamiltonian.amplitude, steps, rabi_error_rel, rabi_ramp_correction\n", + " )\n", + "\n", + " noisy_drive = DrivingField(\n", + " amplitude=noisy_amplitude, detuning=noisy_detuning, phase=program.hamiltonian.phase\n", + " )\n", + "\n", + " return noisy_drive, local_detuning" ] }, { @@ -1082,15 +1125,15 @@ " Args:\n", " postseq (list[int]): The post sequence before applying the measure noise\n", " performance (Performance): The parameters determining the limitations of the Rydberg device\n", - " \n", + "\n", " Returns:\n", " (list[int]): The post sequence after applying the measure noise\n", - " \"\"\" \n", - " \n", + " \"\"\"\n", + "\n", " grd_det_error = float(performance.rydberg.rydbergGlobal.groundDetectionError)\n", " ryd_det_error = float(performance.rydberg.rydbergGlobal.rydbergDetectionError)\n", "\n", - " return apply_binomial_noise(postseq, ryd_det_error, grd_det_error) " + " return apply_binomial_noise(postseq, ryd_det_error, grd_det_error)" ] }, { @@ -1113,15 +1156,17 @@ "outputs": [], "source": [ "from braket.ahs.atom_arrangement import SiteType\n", - "\n", - "from braket.task_result.task_metadata_v1 import TaskMetadata\n", "from braket.task_result.analog_hamiltonian_simulation_task_result_v1 import (\n", " AnalogHamiltonianSimulationShotMeasurement,\n", " AnalogHamiltonianSimulationShotMetadata,\n", " AnalogHamiltonianSimulationShotResult,\n", " AnalogHamiltonianSimulationTaskResult,\n", ")\n", - "from braket.tasks.analog_hamiltonian_simulation_quantum_task_result import AnalogHamiltonianSimulationQuantumTaskResult\n", + "from braket.task_result.task_metadata_v1 import TaskMetadata\n", + "from braket.tasks.analog_hamiltonian_simulation_quantum_task_result import (\n", + " AnalogHamiltonianSimulationQuantumTaskResult,\n", + ")\n", + "\n", "\n", "def ahs_noise_simulation(\n", " program: AnalogHamiltonianSimulation,\n", @@ -1137,56 +1182,53 @@ " performance (Performance): The parameters determining the limitations of the Rydberg device\n", " shots (int): The number of shots for the program\n", " steps (int): The number of time steps in the simulation\n", - " \n", + "\n", " Returns:\n", " (AnalogHamiltonianSimulationQuantumTaskResult): The noisy simulation result of the AHS program\n", - " \"\"\" \n", - " \n", + " \"\"\"\n", + "\n", " measurements = []\n", " for _ in range(shots):\n", - " \n", " sites, fillings, preseq = apply_lattice_initialization_errors(program, performance)\n", " drive, local_detuning = apply_rydberg_noise(program, performance, steps)\n", "\n", " # Assemble the noisy program\n", " register = AtomArrangement()\n", - " for (site, filling) in zip(sites, fillings):\n", + " for site, filling in zip(sites, fillings):\n", " if filling == 1:\n", " register.add(site)\n", " else:\n", " register.add(site, site_type=SiteType.VACANT)\n", "\n", " noisy_program = AnalogHamiltonianSimulation(\n", - " register=register, \n", - " hamiltonian=drive+local_detuning\n", + " register=register, hamiltonian=drive + local_detuning\n", " )\n", "\n", " result = simulator.run(noisy_program, shots=1, steps=steps).result()\n", - " \n", + "\n", " postseq = result.measurements[0].post_sequence\n", - " \n", - " new_postseq = apply_measurement_errors(postseq, performance)\n", "\n", + " new_postseq = apply_measurement_errors(postseq, performance)\n", "\n", " shot_measurement = AnalogHamiltonianSimulationShotMeasurement(\n", " shotMetadata=AnalogHamiltonianSimulationShotMetadata(shotStatus=\"Success\"),\n", " shotResult=AnalogHamiltonianSimulationShotResult(\n", " preSequence=preseq, postSequence=new_postseq\n", " ),\n", - " ) \n", - " \n", + " )\n", + "\n", " measurements.append(shot_measurement)\n", - " \n", + "\n", " task_metadata = TaskMetadata(\n", " id=\"rydberg\",\n", " shots=shots,\n", " deviceId=\"rydbergLocalSimulator\",\n", " )\n", - " \n", + "\n", " ahs_task_result = AnalogHamiltonianSimulationTaskResult(\n", " taskMetadata=task_metadata, measurements=measurements\n", " )\n", - " \n", + "\n", " return AnalogHamiltonianSimulationQuantumTaskResult.from_object(ahs_task_result)" ] }, @@ -1217,7 +1259,9 @@ ], "source": [ "%%time \n", - "noisy_results = [ahs_noise_simulation(program, performance, shots=100, steps = 100) for program in programs]" + "noisy_results = [\n", + " ahs_noise_simulation(program, performance, shots=100, steps=100) for program in programs\n", + "]" ] }, { @@ -1281,19 +1325,20 @@ "source": [ "task_arns = []\n", "for amplitude_area in amplitude_areas:\n", - " program = create_evolve_bell_states(amplitude_area = amplitude_area, \n", - " if_parallel=True, \n", - " )\n", - " \n", + " program = create_evolve_bell_states(\n", + " amplitude_area=amplitude_area,\n", + " if_parallel=True,\n", + " )\n", + "\n", " task = qpu.run(program.discretize(qpu), shots=100)\n", "\n", " metadata = task.metadata()\n", - " task_arn = metadata['quantumTaskArn']\n", + " task_arn = metadata[\"quantumTaskArn\"]\n", " print(task_arn)\n", " task_arns.append(task_arn)\n", "\n", - "with open(f'task_arns.npy', 'wb') as f:\n", - " np.save(f, np.array(task_arns))\n" + "with open(\"task_arns.npy\", \"wb\") as f:\n", + " np.save(f, np.array(task_arns))" ] }, { @@ -1307,7 +1352,7 @@ "source": [ "from braket.aws import AwsQuantumTask\n", "\n", - "with open('task_arns.npy', 'rb') as f:\n", + "with open(\"task_arns.npy\", \"rb\") as f:\n", " task_arns = np.load(f, allow_pickle=True)\n", "\n", "qpu_results = [AwsQuantumTask(arn=task_arn).result() for task_arn in task_arns]\n", @@ -1335,7 +1380,7 @@ "\n", " Args:\n", " counters_qpu (dict[str, int]): Native results from the QPU\n", - " \n", + "\n", " Returns:\n", " (dict[str, int]): Aggregated result from the QPU\n", "\n", @@ -1343,17 +1388,18 @@ " >>> aggregate_qpu_counters({\"grggrgrr\": 10, \"gggrrggg\": 2})\n", " >>> {'gg': 14, 'gr': 12, 'rg': 12, 'rr': 10}\n", " \"\"\"\n", - " \n", - " states = ['gg', 'gr', 'rg', 'rr']\n", - " counters = {state: 0 for state in states} \n", + "\n", + " states = [\"gg\", \"gr\", \"rg\", \"rr\"]\n", + " counters = {state: 0 for state in states}\n", " for key, val in counters_qpu.items():\n", - " for i in range(int(len(key)/2)):\n", - " state = key[2*i:2*i+2]\n", + " for i in range(int(len(key) / 2)):\n", + " state = key[2 * i : 2 * i + 2]\n", " if state in counters.keys():\n", - " counters[state] += val \n", + " counters[state] += val\n", "\n", " return counters\n", "\n", + "\n", "qpu_counters = [aggregate_qpu_counters(item) for item in qpu_counters]" ] }, @@ -1409,14 +1455,16 @@ "source": [ "from copy import deepcopy\n", "from decimal import Decimal\n", - "from braket.device_schema.quera.quera_ahs_paradigm_properties_v1 import RabiCorrection\n", "from typing import Union\n", "\n", + "from braket.device_schema.quera.quera_ahs_paradigm_properties_v1 import RabiCorrection\n", + "\n", + "\n", "def customize_performance_for_field(\n", " performance: Performance,\n", " name: str,\n", " value: Union[float, list[tuple[float, float]]],\n", - " modification_type: str = \"replace\"\n", + " modification_type: str = \"replace\",\n", ") -> Performance:\n", " \"\"\"\n", " Customize a field in the given noise model\n", @@ -1425,27 +1473,32 @@ " performance (Performance): The given noise model\n", " name (str): The name of the field to be modified\n", " value (Union[float, list[tuple[float, float]]]): The updated values for the modified field\n", - " modification_type (str): The behavior of the customization. \n", + " modification_type (str): The behavior of the customization.\n", " If set to \"replace\", the value of the corresponding field will be updated\n", " If set to \"keep_only\", the value of the corresponding field will be updated, and\n", - " all other fields in the noise models will be set to zero. \n", - " \n", + " all other fields in the noise models will be set to zero.\n", + "\n", " Returns:\n", " (Performance): The updated noise model\n", - " \"\"\" \n", - " \n", + " \"\"\"\n", + "\n", " performance = deepcopy(performance)\n", - " \n", + "\n", " def modify_dict(mydict):\n", - " found_key = False # If False, the `name` is not a valid field in the noise model; otherwise True\n", + " found_key = (\n", + " False # If False, the `name` is not a valid field in the noise model; otherwise True\n", + " )\n", " for key, val in mydict.items():\n", " if key == name:\n", - " found_key = True # `name` is found in the noise model\n", + " found_key = True # `name` is found in the noise model\n", " if isinstance(val, Decimal):\n", " mydict[key] = Decimal(str(value))\n", " elif isinstance(val, list):\n", " # Assuming the every list in the performance model is of type `RabiCorrection`\n", - " mydict[key] = [RabiCorrection(rampTime=Decimal(str(t)), rabiCorrection=Decimal(str(v))) for (t, v) in value]\n", + " mydict[key] = [\n", + " RabiCorrection(rampTime=Decimal(str(t)), rabiCorrection=Decimal(str(v)))\n", + " for (t, v) in value\n", + " ]\n", " if modification_type == \"replace\":\n", " return found_key\n", " else:\n", @@ -1455,21 +1508,19 @@ " elif isinstance(val, list):\n", " if modification_type == \"keep-only\":\n", " mydict[key] = [\n", - " RabiCorrection(\n", - " rampTime=corr.rampTime, \n", - " rabiCorrection=Decimal(\"0.999\")\n", - " ) for corr in mydict[key]\n", + " RabiCorrection(rampTime=corr.rampTime, rabiCorrection=Decimal(\"0.999\"))\n", + " for corr in mydict[key]\n", " ]\n", " else:\n", " found_key = found_key or modify_dict(val.__dict__)\n", - " \n", + "\n", " return found_key\n", - " \n", + "\n", " found_key = modify_dict(performance.__dict__)\n", - " \n", + "\n", " if found_key is False:\n", - " raise KeyError(f\"{name} is not a valid field for the noise model\") \n", - " \n", + " raise KeyError(f\"{name} is not a valid field for the noise model\")\n", + "\n", " return performance" ] }, @@ -1542,14 +1593,14 @@ " performance,\n", " \"groundDetectionError\",\n", " performance.rydberg.rydbergGlobal.groundDetectionError,\n", - " modification_type = \"keep-only\"\n", + " modification_type=\"keep-only\",\n", ")\n", "\n", "performance_spam = customize_performance_for_field(\n", " performance_spam,\n", " \"rydbergDetectionError\",\n", " performance.rydberg.rydbergGlobal.rydbergDetectionError,\n", - " modification_type = \"replace\"\n", + " modification_type=\"replace\",\n", ")\n", "\n", "pp(performance_spam)" @@ -1582,7 +1633,9 @@ ], "source": [ "%%time \n", - "noisy_results_spam = [ahs_noise_simulation(program, performance_spam, shots=100, steps = 100) for program in programs]" + "noisy_results_spam = [\n", + " ahs_noise_simulation(program, performance_spam, shots=100, steps=100) for program in programs\n", + "]" ] }, { @@ -1654,8 +1707,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(tracker.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")\n" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/analog_hamiltonian_simulation/ahs_utils.py b/examples/analog_hamiltonian_simulation/ahs_utils.py index 5f9e34c72..a885e8244 100644 --- a/examples/analog_hamiltonian_simulation/ahs_utils.py +++ b/examples/analog_hamiltonian_simulation/ahs_utils.py @@ -1,134 +1,150 @@ -import numpy as np import matplotlib.pyplot as plt import networkx as nx -from braket.ahs.atom_arrangement import SiteType +import numpy as np + +from braket.ahs.atom_arrangement import AtomArrangement, SiteType from braket.ahs.driving_field import DrivingField from braket.ahs.local_detuning import LocalDetuning -from braket.ahs.field import Field -from braket.ahs.pattern import Pattern -from collections import Counter - -from braket.tasks.analog_hamiltonian_simulation_quantum_task_result import AnalogHamiltonianSimulationQuantumTaskResult -from braket.ahs.atom_arrangement import AtomArrangement +from braket.tasks.analog_hamiltonian_simulation_quantum_task_result import ( + AnalogHamiltonianSimulationQuantumTaskResult, +) def show_register( - register: AtomArrangement, - blockade_radius: float=0.0, - what_to_draw: str="bond", - show_atom_index:bool=True + register: AtomArrangement, + blockade_radius: float = 0.0, + what_to_draw: str = "bond", + show_atom_index: bool = True, ): - """Plot the given register - - Args: - register (AtomArrangement): A given register - blockade_radius (float): The blockade radius for the register. Default is 0 - what_to_draw (str): Either "bond" or "circle" to indicate the blockade region. - Default is "bond" - show_atom_index (bool): Whether showing the indices of the atoms. Default is True - + """Plot the given register + + Args: + register (AtomArrangement): A given register + blockade_radius (float): The blockade radius for the register. Default is 0 + what_to_draw (str): Either "bond" or "circle" to indicate the blockade region. + Default is "bond" + show_atom_index (bool): Whether showing the indices of the atoms. Default is True + """ filled_sites = [site.coordinate for site in register if site.site_type == SiteType.FILLED] empty_sites = [site.coordinate for site in register if site.site_type == SiteType.VACANT] - - fig = plt.figure(figsize=(7, 7)) + + plt.figure(figsize=(7, 7)) if filled_sites: - plt.plot(np.array(filled_sites)[:, 0], np.array(filled_sites)[:, 1], 'r.', ms=15, label='filled') + plt.plot( + np.array(filled_sites)[:, 0], np.array(filled_sites)[:, 1], "r.", ms=15, label="filled" + ) if empty_sites: - plt.plot(np.array(empty_sites)[:, 0], np.array(empty_sites)[:, 1], 'k.', ms=5, label='empty') + plt.plot( + np.array(empty_sites)[:, 0], np.array(empty_sites)[:, 1], "k.", ms=5, label="empty" + ) plt.legend(bbox_to_anchor=(1.1, 1.05)) - + if show_atom_index: for idx, site in enumerate(register): plt.text(*site.coordinate, f" {idx}", fontsize=12) - - if blockade_radius > 0 and what_to_draw=="bond": + + if blockade_radius > 0 and what_to_draw == "bond": for i in range(len(filled_sites)): - for j in range(i+1, len(filled_sites)): + for j in range(i + 1, len(filled_sites)): dist = np.linalg.norm(np.array(filled_sites[i]) - np.array(filled_sites[j])) if dist <= blockade_radius: - plt.plot([filled_sites[i][0], filled_sites[j][0]], [filled_sites[i][1], filled_sites[j][1]], 'b') - - if blockade_radius > 0 and what_to_draw=="circle": + plt.plot( + [filled_sites[i][0], filled_sites[j][0]], + [filled_sites[i][1], filled_sites[j][1]], + "b", + ) + + if blockade_radius > 0 and what_to_draw == "circle": for site in filled_sites: - plt.gca().add_patch( plt.Circle((site[0],site[1]), blockade_radius/2, color="b", alpha=0.3) ) + plt.gca().add_patch( + plt.Circle((site[0], site[1]), blockade_radius / 2, color="b", alpha=0.3) + ) plt.gca().set_aspect(1) plt.show() def show_global_drive(drive, axes=None, **plot_ops): """Plot the driving field - Args: - drive (DrivingField): The driving field to be plot - axes: matplotlib axis to draw on - **plot_ops: options passed to matplitlib.pyplot.plot - """ + Args: + drive (DrivingField): The driving field to be plot + axes: matplotlib axis to draw on + **plot_ops: options passed to matplitlib.pyplot.plot + """ data = { - 'amplitude [rad/s]': drive.amplitude.time_series, - 'detuning [rad/s]': drive.detuning.time_series, - 'phase [rad]': drive.phase.time_series, + "amplitude [rad/s]": drive.amplitude.time_series, + "detuning [rad/s]": drive.detuning.time_series, + "phase [rad]": drive.phase.time_series, } - if axes is None: - fig, axes = plt.subplots(3, 1, figsize=(7, 7), sharex=True) + _fig, axes = plt.subplots(3, 1, figsize=(7, 7), sharex=True) for ax, data_name in zip(axes, data.keys()): - if data_name == 'phase [rad]': - ax.step(data[data_name].times(), data[data_name].values(), '.-', where='post',**plot_ops) + if data_name == "phase [rad]": + ax.step( + data[data_name].times(), data[data_name].values(), ".-", where="post", **plot_ops + ) else: - ax.plot(data[data_name].times(), data[data_name].values(), '.-',**plot_ops) + ax.plot(data[data_name].times(), data[data_name].values(), ".-", **plot_ops) ax.set_ylabel(data_name) - ax.grid(ls=':') - axes[-1].set_xlabel('time [s]') + ax.grid(ls=":") + axes[-1].set_xlabel("time [s]") plt.tight_layout() plt.show() -def show_local_detuning(local_detuning:LocalDetuning): +def show_local_detuning(local_detuning: LocalDetuning): """Plot local_detuning - Args: - local_detuning (LocalDetuning): The local detuning to be plotted - """ + Args: + local_detuning (LocalDetuning): The local detuning to be plotted + """ data = local_detuning.magnitude.time_series pattern = local_detuning.magnitude.pattern.series - - plt.plot(data.times(), data.values(), '.-', label="pattern: " + str(pattern)) - plt.xlabel('time [s]') - plt.ylabel('detuning [rad/s]') + + plt.plot(data.times(), data.values(), ".-", label="pattern: " + str(pattern)) + plt.xlabel("time [s]") + plt.ylabel("detuning [rad/s]") plt.legend() plt.tight_layout() plt.show() - + def show_drive_and_local_detuning(drive: DrivingField, local_detuning: LocalDetuning): """Plot the driving field and local detuning - - Args: - drive (DrivingField): The driving field to be plot - local_detuning (LocalDetuning): The local detuning to be plotted - """ + + Args: + drive (DrivingField): The driving field to be plot + local_detuning (LocalDetuning): The local detuning to be plotted + """ drive_data = { - 'amplitude [rad/s]': drive.amplitude.time_series, - 'detuning [rad/s]': drive.detuning.time_series, - 'phase [rad]': drive.phase.time_series, + "amplitude [rad/s]": drive.amplitude.time_series, + "detuning [rad/s]": drive.detuning.time_series, + "phase [rad]": drive.phase.time_series, } - - fig, axes = plt.subplots(4, 1, figsize=(7, 7), sharex=True) + + _fig, axes = plt.subplots(4, 1, figsize=(7, 7), sharex=True) for ax, data_name in zip(axes, drive_data.keys()): - if data_name == 'phase [rad]': - ax.step(drive_data[data_name].times(), drive_data[data_name].values(), '.-', where='post') + if data_name == "phase [rad]": + ax.step( + drive_data[data_name].times(), drive_data[data_name].values(), ".-", where="post" + ) else: - ax.plot(drive_data[data_name].times(), drive_data[data_name].values(), '.-') + ax.plot(drive_data[data_name].times(), drive_data[data_name].values(), ".-") ax.set_ylabel(data_name) - ax.grid(ls=':') - + ax.grid(ls=":") + local_detuning_data = local_detuning.magnitude.time_series - pattern = local_detuning.magnitude.pattern.series - axes[-1].plot(local_detuning_data.times(), local_detuning_data.values(), '.-', label="pattern: " + str(pattern)) - axes[-1].set_ylabel('detuning [rad/s]') - axes[-1].set_xlabel('time [s]') + pattern = local_detuning.magnitude.pattern.series + axes[-1].plot( + local_detuning_data.times(), + local_detuning_data.values(), + ".-", + label="pattern: " + str(pattern), + ) + axes[-1].set_ylabel("detuning [rad/s]") + axes[-1].set_xlabel("time [s]") axes[-1].legend() axes[-1].grid() plt.tight_layout() @@ -138,105 +154,111 @@ def show_drive_and_local_detuning(drive: DrivingField, local_detuning: LocalDetu def show_final_avg_density(result: AnalogHamiltonianSimulationQuantumTaskResult): """Showing a bar plot for the average Rydberg densities from the result - Args: - result (AnalogHamiltonianSimulationQuantumTaskResult): The result - from which the aggregated state counts are obtained - """ + Args: + result (AnalogHamiltonianSimulationQuantumTaskResult): The result + from which the aggregated state counts are obtained + """ avg_density = result.get_avg_density() - + plt.bar(range(len(avg_density)), avg_density) plt.xlabel("Indices of atoms") plt.ylabel("Average Rydberg density") plt.show() -def plot_avg_density_2D(densities, register, with_labels = True, batch_index = None, batch_mapping = None, custom_axes = None): - +def plot_avg_density_2D( + densities, register, with_labels=True, batch_index=None, batch_mapping=None, custom_axes=None +): # get atom coordinates atom_coords = list(zip(register.coordinate_list(0), register.coordinate_list(1))) # convert all to micrometers atom_coords = [(atom_coord[0] * 10**6, atom_coord[1] * 10**6) for atom_coord in atom_coords] - + plot_avg_of_avgs = False plot_single_batch = False - + if batch_index is not None: if batch_mapping is not None: - plot_single_batch = True - # provided both batch and batch_mapping, show averages of single batch - batch_subindices = batch_mapping[batch_index] - batch_labels = {i:label for i,label in enumerate(batch_subindices)} - # get proper positions - pos = {i:tuple(coord) for i,coord in enumerate(list(np.array(atom_coords)[batch_subindices]))} - # narrow down densities - densities = np.array(densities)[batch_subindices] - + plot_single_batch = True + # provided both batch and batch_mapping, show averages of single batch + batch_subindices = batch_mapping[batch_index] + batch_labels = {i: label for i, label in enumerate(batch_subindices)} + # get proper positions + pos = { + i: tuple(coord) + for i, coord in enumerate(list(np.array(atom_coords)[batch_subindices])) + } + # narrow down densities + densities = np.array(densities)[batch_subindices] + else: raise Exception("batch_mapping required to index into") else: if batch_mapping is not None: plot_avg_of_avgs = True # just need the coordinates for first batch_mapping - subcoordinates = np.array(atom_coords)[batch_mapping[(0,0)]] - pos = {i:coord for i,coord in enumerate(subcoordinates)} + subcoordinates = np.array(atom_coords)[batch_mapping[(0, 0)]] + pos = {i: coord for i, coord in enumerate(subcoordinates)} else: # If both not provided do standard FOV # handle 1D case - pos = {i:coord for i,coord in enumerate(atom_coords)} - + pos = {i: coord for i, coord in enumerate(atom_coords)} + # get colors vmin = 0 vmax = 1 cmap = plt.cm.Blues - + # construct graph g = nx.Graph() g.add_nodes_from(list(range(len(densities)))) - + # construct plot if custom_axes is None: - fig, ax = plt.subplots() + _fig, ax = plt.subplots() else: ax = custom_axes - - nx.draw(g, - pos, - node_color=densities, - cmap=cmap, - node_shape="o", - vmin=vmin, - vmax=vmax, - font_size=9, - with_labels=with_labels, - labels= batch_labels if plot_single_batch else None, - ax = custom_axes if custom_axes is not None else ax) - + + nx.draw( + g, + pos, + node_color=densities, + cmap=cmap, + node_shape="o", + vmin=vmin, + vmax=vmax, + font_size=9, + with_labels=with_labels, + labels=batch_labels if plot_single_batch else None, + ax=custom_axes if custom_axes is not None else ax, + ) + ## Set axes ax.set_axis_on() - ax.tick_params(left=True, - bottom=True, - top=True, - right=True, - labelleft=True, - labelbottom=True, - # labeltop=True, - # labelright=True, - direction="in") + ax.tick_params( + left=True, + bottom=True, + top=True, + right=True, + labelleft=True, + labelbottom=True, + # labeltop=True, + # labelright=True, + direction="in", + ) ## Set colorbar sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=vmin, vmax=vmax)) sm.set_array([]) - ax.ticklabel_format(style="sci", useOffset=False) - + # set titles on x and y axes plt.xlabel("x [μm]") plt.ylabel("y [μm]") - - + if plot_avg_of_avgs: cbar_label = "Averaged Rydberg Density" else: cbar_label = "Rydberg Density" - + plt.colorbar(sm, ax=ax, label=cbar_label) diff --git a/examples/braket_features/Allocating_Qubits_on_QPU_Devices.ipynb b/examples/braket_features/Allocating_Qubits_on_QPU_Devices.ipynb index da493676b..94bd7eebc 100644 --- a/examples/braket_features/Allocating_Qubits_on_QPU_Devices.ipynb +++ b/examples/braket_features/Allocating_Qubits_on_QPU_Devices.ipynb @@ -1,556 +1,563 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Allocating Qubits on QPU Devices" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", - "from braket.tracking import Tracker\n", - "t = Tracker().start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook demonstrates how you can specify explicitly which qubits to use when you run a quantum circuit on QPU devices from Rigetti.\n", - "\n", - "When you submit a circuit for execution on a QPU, Amazon Braket performs a series of compilation steps: it maps the _abstract qubits_ in your circuit to _physical qubits_ in the device; it synthesizes gates into the native gate set of the device; it optimizes the circuit to reduce the number of gates; and finally, it translates the gates into executable pulses.\n", - "\n", - "This section shows how the first step, called qubit allocation, works for the Rigetti Ankaa-2 device." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# general imports\n", - "from braket.aws import AwsDevice\n", - "from braket.circuits import Circuit\n", - "from braket.devices import Devices\n", - "import numpy as np\n", - "import random" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "## Automatic qubit allocation\n", - "\n", - "Qubit allocation for Rigetti devices on Amazon Braket utilizes [the Quil Compilers](https://pyquil-docs.rigetti.com/en/latest/compiler.html#the-quil-compiler)'s _rewiring_ strategies. By default, when you submit a circuit on Amazon Braket to a Rigetti device, the circuit is rewired according to the [PARTIAL](https://pyquil-docs.rigetti.com/en/latest/compiler.html#partial) rewiring strategy. Specifically, the compiler starts with an empty mapping from logical to physical qubits. Taking into account the latest calibration data of the device, the compiler fills in the mapping with the goal, sequentially, to maximize the overall fidelity of the circuit.\n", - "\n", - "The example that follows shows how to create a GHZ state on qubits that are not physically connected. After the quantum task is completed, you can obtain a list of the actual gates executed on the device, by viewing the result metadata.\n", - "\n", - "First, instantiate the Rigetti Ankaa-2 device and retrieve its connectivity graph, which shows the qubits that are directly connected on the chip." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "the connectivity of Ankaa-2 is: {'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n" - ] - } - ], - "source": [ - "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "\n", - "connectivity_graph = device.properties.paradigm.connectivity.connectivityGraph\n", - "print(f\"the connectivity of {device.name} is: {connectivity_graph}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "Next, create a GHZ circuit with three qubits 0, 2, 4, and run it on the Ankaa 2 device. Notice that none of these qubits are connected on the Ankaa 2 connectivity graph." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │\n", - " ┌───┐ \n", - "q0 : ─┤ H ├───●─────●───\n", - " └───┘ │ │ \n", - " ┌─┴─┐ │ \n", - "q2 : ───────┤ X ├───┼───\n", - " └───┘ │ \n", - " ┌─┴─┐ \n", - "q4 : ─────────────┤ X ├─\n", - " └───┘ \n", - "T : │ 0 │ 1 │ 2 │\n" - ] - } - ], - "source": [ - "# create a GHZ state with non-neighboring qubits\n", - "circuit = Circuit()\n", - "circuit.h(0).cnot(0,2).cnot(0,4)\n", - "print(circuit)\n", - "\n", - "rigetti_rewiring = device.run(circuit, shots=10)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Status of quantum task: QUEUED\n" - ] - } - ], - "source": [ - "print(\"Status of quantum task:\", rigetti_rewiring.state())" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "To verify the final qubit allocation, retrieve the compiled program that was executed:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Measurement counts: Counter({'111': 6, '000': 3, '101': 1})\n", - "The compiled circuit is:\n", - " PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[3]\n", - "PRAGMA PRESERVE_BLOCK\n", - "RX(1.5707963267948966) 5\n", - "RZ(3.141592653589793) 5\n", - "ISWAP 5 12\n", - "RZ(1.5707963267948966) 5\n", - "RX(1.5707963267948966) 5\n", - "RZ(4.71238898038469) 5\n", - "ISWAP 5 12\n", - "RZ(1.5707963267948966) 5\n", - "RZ(3.141592653589793) 12\n", - "ISWAP 5 6\n", - "RX(1.5707963267948966) 12\n", - "RZ(1.5707963267948966) 5\n", - "RX(1.5707963267948966) 5\n", - "RZ(4.71238898038469) 5\n", - "ISWAP 5 6\n", - "RZ(3.141592653589793) 6\n", - "RX(1.5707963267948966) 6\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 12 ro[1]\n", - "MEASURE 5 ro[0]\n", - "MEASURE 6 ro[2]\n" - ] - } - ], - "source": [ - "result = rigetti_rewiring.result()\n", - "counts = result.measurement_counts\n", - "print(\"Measurement counts:\", counts)\n", - "print(\"The compiled circuit is:\\n\", result.additional_metadata.rigettiMetadata.compiledProgram)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "Notice that the PARTIAL rewiring was applied. The qubits 0, 2, 4 in the original circuit were mapped to three other qubits in the Rigetti device, and the gates were compiled into native gates." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## User-defined qubit allocation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In Amazon Braket, you can choose to prescribe a qubit mapping manually, and prevent further rewiring for Rigetti devices. To enable manual mapping, set `disable_qubit_rewiring=True` when submitting the quantum task to run.\n", - "\n", - "If all the gates in the circuit satisfy the topological constraints of the device, Amazon Braket maps abstract qubit $i$ in the circuit to the physical qubit $i$ in the device, and maps qubit pair $(i, j)$ to the connection $(i, j)$ in the device. On the other hand, Amazon Braket raises an exception if a specified qubit or qubit pair do not exist in the device connectivity graph." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │\n", - " ┌──────────┐ \n", - "q0 : ─┤ Rz(1.57) ├───●───\n", - " └──────────┘ │ \n", - " ┌─┴─┐ \n", - "q1 : ──────────────┤ X ├─\n", - " └───┘ \n", - " ┌───┐ \n", - "q7 : ────┤ X ├───────────\n", - " └───┘ \n", - "T : │ 0 │ 1 │\n" - ] - } - ], - "source": [ - "# create a random state with neighboring qubits\n", - "q1=random.choice(list(connectivity_graph))\n", - "q2=int(connectivity_graph[q1][0])\n", - "q1=int(q1)\n", - "\n", - "circuit = Circuit()\n", - "circuit.rz(0,np.pi/2).cnot(q1,q2).x(7)\n", - "print(circuit)\n", - "rigetti_task = device.run(circuit, shots=10, disable_qubit_rewiring=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Status of quantum task: QUEUED\n" - ] - } - ], - "source": [ - "print(\"Status of quantum task:\", rigetti_task.state())" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Measurement counts: Counter({'001': 7, '000': 2, '011': 1})\n", - "The compiled circuit is:\n", - " PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[3]\n", - "PRAGMA PRESERVE_BLOCK\n", - "RX(1.5707963267948966) 0\n", - "RX(1.5707963267948966) 7\n", - "RZ(4.71238898038469) 0\n", - "RX(1.5707963267948966) 7\n", - "ISWAP 0 1\n", - "RZ(3.141592653589793) 1\n", - "RX(1.5707963267948966) 1\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 7 ro[2]\n", - "MEASURE 0 ro[0]\n", - "MEASURE 1 ro[1]\n" - ] - } - ], - "source": [ - "result = rigetti_task.result()\n", - "counts = result.measurement_counts\n", - "print(\"Measurement counts:\", counts)\n", - "print(\"The compiled circuit is:\\n\", result.additional_metadata.rigettiMetadata.compiledProgram)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "The qubits in the original circuit followed a one-to-one mapping to the physical qubits in the device. Other compilation steps, such as gate synthesis and circuit optimization, are still performed. These steps allow the circuit to run successfully and improve the overall fidelity." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using the qubits with the highest two-qubit gate fidelity\n", - "\n", - "Additionally, the device properties include calibration data, which you can use to find the qubits and qubit pairs with the highest fidelities for particular gates.\n", - "\n", - "The following function finds the qubit pair that has the highest two-qubit fidelity of an input gate, which can be any of the gates native to the Rigetti device. First, you can access the native gates as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['RX', 'RZ', 'CZ', 'ISWAP']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "native_gates = device.properties.paradigm.nativeGateSet\n", - "gates_uppercase = [gate.upper() for gate in native_gates]\n", - "gates_uppercase" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "def find_qubit_pair(gate):\n", - " \"Function to find the qubit pair that has the highest gate fidelity of a particular gate\"\n", - " \n", - " # check whether the input gate is a string\n", - " if not isinstance(gate, str):\n", - " raise ValueError('The input gate must be a string type.') \n", - " \n", - " # check whether the input gate is a native gate\n", - " gate_list = gates_uppercase\n", - " if gate not in gate_list:\n", - " raise ValueError(f'The input gate must be one of {gates_uppercase}.')\n", - " \n", - " # load all calibration data from device.properties\n", - " calibration_2Q = device.properties.provider.specs['2Q']\n", - " highest_fidelity = 0\n", - "\n", - " # iterate through all calibration data to find the highest fidelity\n", - " for pair in calibration_2Q.keys():\n", - " # if the particular gate type is supported by the qubit pair\n", - " if ('f'+ gate) in calibration_2Q[pair].keys(): \n", - " if calibration_2Q[pair]['f'+ gate] > highest_fidelity: \n", - " # update the highest_fidelity and the best_pair\n", - " highest_fidelity = calibration_2Q[pair]['f'+ gate]\n", - " best_pair = pair\n", - "\n", - " # generate the two qubits as integers \n", - " q1 = best_pair[0]\n", - " i = 1\n", - " while best_pair[i] != '-':\n", - " q1 += best_pair[i]\n", - " i += 1\n", - "\n", - " q1 = int(q1)\n", - " q2 = int(best_pair[i+1:])\n", - " \n", - " return q1, q2, highest_fidelity" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "The example in the following code applies a native two-qubit gate on the qubit pair that has the highest fidelity of that gate. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The highest fidelity for ISWAP gate is: 0.99312484820244\n", - "And the corresponding qubit pair is: qubit 73 and qubit 74\n", - "T : │ 0 │\n", - " \n", - "q73 : ───●───\n", - " │ \n", - " ┌─┴─┐ \n", - "q74 : ─┤ Z ├─\n", - " └───┘ \n", - "T : │ 0 │\n" - ] - } - ], - "source": [ - "# the gate must be a native gate\n", - "gate = 'ISWAP'\n", - "# find the qubit pair with the highest gate fidelity\n", - "q1, q2, highest_fidelity = find_qubit_pair(gate)\n", - "print('The highest fidelity for '+gate+' gate is:', highest_fidelity)\n", - "print(f'And the corresponding qubit pair is: qubit {q1} and qubit {q2}')\n", - "\n", - "# create a circuit with the gate applied to the discovered qubit pair.\n", - "# note that CPHASE in Rigetti corresponds to cphaseshift in Braket\n", - "circuit = Circuit()\n", - "circuit.cz(q1,q2)\n", - "print(circuit)\n", - "rigetti_task = device.run(circuit, shots=1000, disable_qubit_rewiring=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Status of quantum task: QUEUED\n" - ] - } - ], - "source": [ - "print(\"Status of quantum task:\", rigetti_task.state())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The qubits in the original circuit followed a one-to-one mapping to the physical qubits in the device. Since only native gates were used, the actual gates executed are the same as the gates in the original circuit." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "
\n", - "Note: The IonQ device does not support manual allocation. For circuits submitted to the IonQ device, qubits are allocated automatically.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Quantum Task Summary\n", - "{<_Rigetti.Ankaa2: 'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2'>: {'shots': 1020, 'tasks': {'COMPLETED': 2, 'QUEUED': 1}}}\n", - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run this example: 1.82 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "braket", - "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.11" - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Allocating Qubits on QPU Devices" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", + "from braket.tracking import Tracker\n", + "\n", + "t = Tracker().start()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook demonstrates how you can specify explicitly which qubits to use when you run a quantum circuit on QPU devices from Rigetti.\n", + "\n", + "When you submit a circuit for execution on a QPU, Amazon Braket performs a series of compilation steps: it maps the _abstract qubits_ in your circuit to _physical qubits_ in the device; it synthesizes gates into the native gate set of the device; it optimizes the circuit to reduce the number of gates; and finally, it translates the gates into executable pulses.\n", + "\n", + "This section shows how the first step, called qubit allocation, works for the Rigetti Ankaa-2 device." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# general imports\n", + "import random\n", + "\n", + "import numpy as np\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit\n", + "from braket.devices import Devices" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Automatic qubit allocation\n", + "\n", + "Qubit allocation for Rigetti devices on Amazon Braket utilizes [the Quil Compilers](https://pyquil-docs.rigetti.com/en/latest/compiler.html#the-quil-compiler)'s _rewiring_ strategies. By default, when you submit a circuit on Amazon Braket to a Rigetti device, the circuit is rewired according to the [PARTIAL](https://pyquil-docs.rigetti.com/en/latest/compiler.html#partial) rewiring strategy. Specifically, the compiler starts with an empty mapping from logical to physical qubits. Taking into account the latest calibration data of the device, the compiler fills in the mapping with the goal, sequentially, to maximize the overall fidelity of the circuit.\n", + "\n", + "The example that follows shows how to create a GHZ state on qubits that are not physically connected. After the quantum task is completed, you can obtain a list of the actual gates executed on the device, by viewing the result metadata.\n", + "\n", + "First, instantiate the Rigetti Ankaa-2 device and retrieve its connectivity graph, which shows the qubits that are directly connected on the chip." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the connectivity of Ankaa-2 is: {'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n" + ] + } + ], + "source": [ + "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "\n", + "connectivity_graph = device.properties.paradigm.connectivity.connectivityGraph\n", + "print(f\"the connectivity of {device.name} is: {connectivity_graph}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Next, create a GHZ circuit with three qubits 0, 2, 4, and run it on the Ankaa 2 device. Notice that none of these qubits are connected on the Ankaa 2 connectivity graph." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │\n", + " ┌───┐ \n", + "q0 : ─┤ H ├───●─────●───\n", + " └───┘ │ │ \n", + " ┌─┴─┐ │ \n", + "q2 : ───────┤ X ├───┼───\n", + " └───┘ │ \n", + " ┌─┴─┐ \n", + "q4 : ─────────────┤ X ├─\n", + " └───┘ \n", + "T : │ 0 │ 1 │ 2 │\n" + ] + } + ], + "source": [ + "# create a GHZ state with non-neighboring qubits\n", + "circuit = Circuit()\n", + "circuit.h(0).cnot(0, 2).cnot(0, 4)\n", + "print(circuit)\n", + "\n", + "rigetti_rewiring = device.run(circuit, shots=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Status of quantum task: QUEUED\n" + ] + } + ], + "source": [ + "print(\"Status of quantum task:\", rigetti_rewiring.state())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "To verify the final qubit allocation, retrieve the compiled program that was executed:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Measurement counts: Counter({'111': 6, '000': 3, '101': 1})\n", + "The compiled circuit is:\n", + " PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[3]\n", + "PRAGMA PRESERVE_BLOCK\n", + "RX(1.5707963267948966) 5\n", + "RZ(3.141592653589793) 5\n", + "ISWAP 5 12\n", + "RZ(1.5707963267948966) 5\n", + "RX(1.5707963267948966) 5\n", + "RZ(4.71238898038469) 5\n", + "ISWAP 5 12\n", + "RZ(1.5707963267948966) 5\n", + "RZ(3.141592653589793) 12\n", + "ISWAP 5 6\n", + "RX(1.5707963267948966) 12\n", + "RZ(1.5707963267948966) 5\n", + "RX(1.5707963267948966) 5\n", + "RZ(4.71238898038469) 5\n", + "ISWAP 5 6\n", + "RZ(3.141592653589793) 6\n", + "RX(1.5707963267948966) 6\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 12 ro[1]\n", + "MEASURE 5 ro[0]\n", + "MEASURE 6 ro[2]\n" + ] + } + ], + "source": [ + "result = rigetti_rewiring.result()\n", + "counts = result.measurement_counts\n", + "print(\"Measurement counts:\", counts)\n", + "print(\"The compiled circuit is:\\n\", result.additional_metadata.rigettiMetadata.compiledProgram)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Notice that the PARTIAL rewiring was applied. The qubits 0, 2, 4 in the original circuit were mapped to three other qubits in the Rigetti device, and the gates were compiled into native gates." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## User-defined qubit allocation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Amazon Braket, you can choose to prescribe a qubit mapping manually, and prevent further rewiring for Rigetti devices. To enable manual mapping, set `disable_qubit_rewiring=True` when submitting the quantum task to run.\n", + "\n", + "If all the gates in the circuit satisfy the topological constraints of the device, Amazon Braket maps abstract qubit $i$ in the circuit to the physical qubit $i$ in the device, and maps qubit pair $(i, j)$ to the connection $(i, j)$ in the device. On the other hand, Amazon Braket raises an exception if a specified qubit or qubit pair do not exist in the device connectivity graph." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │\n", + " ┌──────────┐ \n", + "q0 : ─┤ Rz(1.57) ├───●───\n", + " └──────────┘ │ \n", + " ┌─┴─┐ \n", + "q1 : ──────────────┤ X ├─\n", + " └───┘ \n", + " ┌───┐ \n", + "q7 : ────┤ X ├───────────\n", + " └───┘ \n", + "T : │ 0 │ 1 │\n" + ] + } + ], + "source": [ + "# create a random state with neighboring qubits\n", + "q1 = random.choice(list(connectivity_graph))\n", + "q2 = int(connectivity_graph[q1][0])\n", + "q1 = int(q1)\n", + "\n", + "circuit = Circuit()\n", + "circuit.rz(0, np.pi / 2).cnot(q1, q2).x(7)\n", + "print(circuit)\n", + "rigetti_task = device.run(circuit, shots=10, disable_qubit_rewiring=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Status of quantum task: QUEUED\n" + ] + } + ], + "source": [ + "print(\"Status of quantum task:\", rigetti_task.state())" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Measurement counts: Counter({'001': 7, '000': 2, '011': 1})\n", + "The compiled circuit is:\n", + " PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[3]\n", + "PRAGMA PRESERVE_BLOCK\n", + "RX(1.5707963267948966) 0\n", + "RX(1.5707963267948966) 7\n", + "RZ(4.71238898038469) 0\n", + "RX(1.5707963267948966) 7\n", + "ISWAP 0 1\n", + "RZ(3.141592653589793) 1\n", + "RX(1.5707963267948966) 1\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 7 ro[2]\n", + "MEASURE 0 ro[0]\n", + "MEASURE 1 ro[1]\n" + ] + } + ], + "source": [ + "result = rigetti_task.result()\n", + "counts = result.measurement_counts\n", + "print(\"Measurement counts:\", counts)\n", + "print(\"The compiled circuit is:\\n\", result.additional_metadata.rigettiMetadata.compiledProgram)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "The qubits in the original circuit followed a one-to-one mapping to the physical qubits in the device. Other compilation steps, such as gate synthesis and circuit optimization, are still performed. These steps allow the circuit to run successfully and improve the overall fidelity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using the qubits with the highest two-qubit gate fidelity\n", + "\n", + "Additionally, the device properties include calibration data, which you can use to find the qubits and qubit pairs with the highest fidelities for particular gates.\n", + "\n", + "The following function finds the qubit pair that has the highest two-qubit fidelity of an input gate, which can be any of the gates native to the Rigetti device. First, you can access the native gates as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['RX', 'RZ', 'CZ', 'ISWAP']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "native_gates = device.properties.paradigm.nativeGateSet\n", + "gates_uppercase = [gate.upper() for gate in native_gates]\n", + "gates_uppercase" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "def find_qubit_pair(gate):\n", + " \"Function to find the qubit pair that has the highest gate fidelity of a particular gate\"\n", + "\n", + " # check whether the input gate is a string\n", + " if not isinstance(gate, str):\n", + " raise ValueError(\"The input gate must be a string type.\")\n", + "\n", + " # check whether the input gate is a native gate\n", + " gate_list = gates_uppercase\n", + " if gate not in gate_list:\n", + " raise ValueError(f\"The input gate must be one of {gates_uppercase}.\")\n", + "\n", + " # load all calibration data from device.properties\n", + " calibration_2Q = device.properties.provider.specs[\"2Q\"]\n", + " highest_fidelity = 0\n", + "\n", + " # iterate through all calibration data to find the highest fidelity\n", + " for pair in calibration_2Q.keys():\n", + " # if the particular gate type is supported by the qubit pair\n", + " if (\"f\" + gate) in calibration_2Q[pair].keys():\n", + " if calibration_2Q[pair][\"f\" + gate] > highest_fidelity:\n", + " # update the highest_fidelity and the best_pair\n", + " highest_fidelity = calibration_2Q[pair][\"f\" + gate]\n", + " best_pair = pair\n", + "\n", + " # generate the two qubits as integers\n", + " q1 = best_pair[0]\n", + " i = 1\n", + " while best_pair[i] != \"-\":\n", + " q1 += best_pair[i]\n", + " i += 1\n", + "\n", + " q1 = int(q1)\n", + " q2 = int(best_pair[i + 1 :])\n", + "\n", + " return q1, q2, highest_fidelity" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "The example in the following code applies a native two-qubit gate on the qubit pair that has the highest fidelity of that gate. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The highest fidelity for ISWAP gate is: 0.99312484820244\n", + "And the corresponding qubit pair is: qubit 73 and qubit 74\n", + "T : │ 0 │\n", + " \n", + "q73 : ───●───\n", + " │ \n", + " ┌─┴─┐ \n", + "q74 : ─┤ Z ├─\n", + " └───┘ \n", + "T : │ 0 │\n" + ] + } + ], + "source": [ + "# the gate must be a native gate\n", + "gate = \"ISWAP\"\n", + "# find the qubit pair with the highest gate fidelity\n", + "q1, q2, highest_fidelity = find_qubit_pair(gate)\n", + "print(\"The highest fidelity for \" + gate + \" gate is:\", highest_fidelity)\n", + "print(f\"And the corresponding qubit pair is: qubit {q1} and qubit {q2}\")\n", + "\n", + "# create a circuit with the gate applied to the discovered qubit pair.\n", + "# note that CPHASE in Rigetti corresponds to cphaseshift in Braket\n", + "circuit = Circuit()\n", + "circuit.cz(q1, q2)\n", + "print(circuit)\n", + "rigetti_task = device.run(circuit, shots=1000, disable_qubit_rewiring=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Status of quantum task: QUEUED\n" + ] + } + ], + "source": [ + "print(\"Status of quantum task:\", rigetti_task.state())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The qubits in the original circuit followed a one-to-one mapping to the physical qubits in the device. Since only native gates were used, the actual gates executed are the same as the gates in the original circuit." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "
\n", + "Note: The IonQ device does not support manual allocation. For circuits submitted to the IonQ device, qubits are allocated automatically.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum Task Summary\n", + "{<_Rigetti.Ankaa2: 'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2'>: {'shots': 1020, 'tasks': {'COMPLETED': 2, 'QUEUED': 1}}}\n", + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run this example: 1.82 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(t.quantum_tasks_statistics())\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "braket", + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/braket_features/Error_Mitigation_on_Amazon_Braket.ipynb b/examples/braket_features/Error_Mitigation_on_Amazon_Braket.ipynb index 92e442f73..7505d170d 100644 --- a/examples/braket_features/Error_Mitigation_on_Amazon_Braket.ipynb +++ b/examples/braket_features/Error_Mitigation_on_Amazon_Braket.ipynb @@ -28,10 +28,11 @@ "source": [ "import numpy as np\n", "import pandas as pd\n", + "from phase_estimation import phase_estimation_circuit\n", + "\n", "from braket.aws import AwsDevice\n", - "from braket.devices import Devices, LocalSimulator\n", + "from braket.devices import Devices\n", "from braket.tracking import Tracker\n", - "from phase_estimation import phase_estimation_circuit\n", "\n", "%matplotlib inline" ] diff --git a/examples/braket_features/Getting_Devices_and_Checking_Device_Properties.ipynb b/examples/braket_features/Getting_Devices_and_Checking_Device_Properties.ipynb index 45dd39fb5..d41d727b6 100644 --- a/examples/braket_features/Getting_Devices_and_Checking_Device_Properties.ipynb +++ b/examples/braket_features/Getting_Devices_and_Checking_Device_Properties.ipynb @@ -1,1904 +1,1905 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Getting Devices and Checking Device Properties\n", - "\n", - "This tutorial demonstrates how to use the `get_devices()` method to search and instantiate devices available on Amazon Braket. It also shows how to obtain access to properties for simulator and QPU devices." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:22.928626Z", - "start_time": "2023-08-29T21:51:20.846031Z" - } - }, - "outputs": [], - "source": [ - "# general imports\n", - "import json\n", - "from braket.aws import AwsDevice\n", - "from braket.devices import Devices, LocalSimulator" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using get_devices\n", - "You can get a device, including the on-demand simulators and the QPUs, by calling the `get_devices()` method. Search for devices with one or more of the following filtering criteria:\n", - "* device arn \n", - "* name \n", - "* type \n", - "* status \n", - "* provider_name. \n", - "\n", - "The following cells give examples for each of the cases." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the device by type" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:23.791309Z", - "start_time": "2023-08-29T21:51:22.939296Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': SV1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/sv1),\n", - " Device('name': TN1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/tn1),\n", - " Device('name': dm1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/dm1)]" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# to get the on-demand simulators\n", - "AwsDevice.get_devices(types=['SIMULATOR'])" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2),\n", - " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", - " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", - " Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2),\n", - " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", - " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet)]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# to get the list of QPUs\n", - "AwsDevice.get_devices(types=['QPU'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the device by ARN\n", - "For every type of device available in Amazon Braket, you can find the associated ARN in the Amazon Braket [Developer Guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html). You also can view the device ARN on the `Devices` section in the Amazon Braket console." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:40.189738Z", - "start_time": "2023-08-29T21:51:38.108942Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1)]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# for example, the following ARN refers to the IonQ device.\n", - "AwsDevice.get_devices(arns=['arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the device by name" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:44.199001Z", - "start_time": "2023-08-29T21:51:40.203505Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2)]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# for example, the following name refers to a Rigetti Ankaa system.\n", - "AwsDevice.get_devices(names=['Ankaa-2'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the device by status" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:49.133297Z", - "start_time": "2023-08-29T21:51:44.215934Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2),\n", - " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", - " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", - " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", - " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet),\n", - " Device('name': SV1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/sv1),\n", - " Device('name': TN1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/tn1),\n", - " Device('name': dm1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/dm1)]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# retrieve all devices that are currently online\n", - "AwsDevice.get_devices(statuses=['ONLINE'])" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:52.891651Z", - "start_time": "2023-08-29T21:51:49.147757Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2)]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# retrieve all devices that are currently offline\n", - "AwsDevice.get_devices(statuses=['OFFLINE'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the device by provider_name" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:51:56.454044Z", - "start_time": "2023-08-29T21:51:52.891938Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", - " Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2),\n", - " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1)]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# for example, the following ARN retrieves the IonQ device.\n", - "AwsDevice.get_devices(provider_names=['IonQ'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Retrieve devices in order" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:52:10.758716Z", - "start_time": "2023-08-29T21:51:56.382501Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': TN1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/tn1),\n", - " Device('name': SV1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/sv1),\n", - " Device('name': dm1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/dm1),\n", - " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet),\n", - " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", - " Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2),\n", - " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", - " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", - " Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2)]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# retrieve the list of devices, ordered by provider name\n", - "AwsDevice.get_devices(order_by='provider_name')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting the device with multiple criteria" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:52:15.233392Z", - "start_time": "2023-08-29T21:52:10.769127Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2),\n", - " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", - " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", - " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", - " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet)]" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# multiple criteria can be applied\n", - "AwsDevice.get_devices(types=['QPU'],statuses=['ONLINE'])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Getting a device directly\n", - "You can specify a device directly, with the device ARN. These ARNs can be specified from each device's entry in the `Devices` enum:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:52:17.486681Z", - "start_time": "2023-08-29T21:52:15.244209Z" - } - }, - "outputs": [], - "source": [ - "# specify a device directly by device ARN\n", - "# Rigetti\n", - "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "# IonQ\n", - "device = AwsDevice(Devices.IonQ.Aria1)\n", - "# IQM\n", - "device = AwsDevice(Devices.IQM.Garnet)\n", - "# the on-demand simulator SV1\n", - "device = AwsDevice(Devices.Amazon.SV1)\n", - "# the on-demand simulator TN1\n", - "device = AwsDevice(Devices.Amazon.TN1)\n", - "# the local simulator\n", - "device = LocalSimulator()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Properties of devices\n", - "\n", - "You can check properties of a device with the `device.properties` call. The following examples show some useful properties of each device." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:52:17.759631Z", - "start_time": "2023-08-29T21:52:17.502344Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The supported operations of SV1 are ['ccnot', 'cnot', 'cphaseshift', 'cphaseshift00', 'cphaseshift01', 'cphaseshift10', 'cswap', 'cy', 'cz', 'ecr', 'h', 'i', 'iswap', 'pswap', 'phaseshift', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'unitary', 'v', 'vi', 'x', 'xx', 'xy', 'y', 'yy', 'z', 'zz']\n", - "\n", - "The supported result types are [ResultType(name='Sample', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=1, maxShots=100000), ResultType(name='Expectation', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Variance', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Probability', observables=None, minShots=1, maxShots=100000), ResultType(name='Amplitude', observables=None, minShots=0, maxShots=0)]\n", - "\n", - "The maximum number of qubits supported by this device is 34\n", - "The shots range of this device is (0, 100000)\n", - "The price of running quantum tasks on this device: price=0.075 unit='minute'\n" - ] - } - ], - "source": [ - "# the on-demand simulator SV1\n", - "device = AwsDevice(Devices.Amazon.SV1)\n", - "\n", - "support_gates = device.properties.action['braket.ir.jaqcd.program'].supportedOperations\n", - "support_result_types = device.properties.action['braket.ir.jaqcd.program'].supportedResultTypes\n", - "qubit_count = device.properties.paradigm.qubitCount\n", - "shots_range = device.properties.service.shotsRange\n", - "device_cost = device.properties.service.deviceCost\n", - "\n", - "print(f'The supported operations of {device.name} are {support_gates}\\n')\n", - "print(f'The supported result types are {support_result_types}\\n')\n", - "print('The maximum number of qubits supported by this device is', qubit_count)\n", - "print('The shots range of this device is', shots_range)\n", - "print('The price of running quantum tasks on this device:', device_cost)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For the IonQ and Rigetti devices, you can get information about the properties shown previously. You also can get information about the availability windows and the device calibration data." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "ExecuteTime": { - "end_time": "2023-08-29T21:52:19.588547Z", - "start_time": "2023-08-29T21:52:17.773910Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The availability windows for Ankaa-2:\n", - "[DeviceExecutionWindow(executionDay=, windowStartHour=datetime.time(0, 0), windowEndHour=datetime.time(23, 59))]\n", - "\n", - "The connectivity graph of the qubits for this device:\n", - " fullyConnected=False connectivityGraph={'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n", - "\n", - "Calibration data:\n", - " {\n", - " \"1Q\": {\n", - " \"0\": {\n", - " \"T1\": 9.188738589920766e-06,\n", - " \"T2\": 1.5115358086466058e-05,\n", - " \"f1QRB\": 0.9989751997430271,\n", - " \"f1QRB_std_err\": 2.0679831486331732e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9977906923503519,\n", - " \"f1Q_simultaneous_RB_std_err\": 5.022804153387717e-05,\n", - " \"fRO\": 0.9279999999999999\n", - " },\n", - " \"1\": {\n", - " \"T1\": 1.1424822873905215e-05,\n", - " \"T2\": 7.81925508978389e-06,\n", - " \"f1QRB\": 0.9986392103526047,\n", - " \"f1QRB_std_err\": 2.5837382143438492e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9953277301386305,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00042743732391299096,\n", - " \"fRO\": 0.945\n", - " },\n", - " \"10\": {\n", - " \"T1\": 1.4397388097206513e-05,\n", - " \"T2\": 1.339262710713176e-05,\n", - " \"f1QRB\": 0.9983666919759847,\n", - " \"f1QRB_std_err\": 0.0002540204792082052,\n", - " \"f1Q_simultaneous_RB\": 0.9949091215921125,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0008697771710166471,\n", - " \"fRO\": 0.921\n", - " },\n", - " \"11\": {\n", - " \"T1\": 1.3586183291642084e-05,\n", - " \"T2\": 8.375930706648994e-06,\n", - " \"f1QRB\": 0.9987291309192002,\n", - " \"f1QRB_std_err\": 3.472614079514786e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9729235723436281,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.002137921614257448,\n", - " \"fRO\": 0.8560000000000001\n", - " },\n", - " \"12\": {\n", - " \"T1\": 1.4839379784194732e-05,\n", - " \"T2\": 1.818202231054693e-05,\n", - " \"f1QRB\": 0.998776996620199,\n", - " \"f1QRB_std_err\": 4.4974028122863406e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9979066727008618,\n", - " \"f1Q_simultaneous_RB_std_err\": 5.178760285397647e-05,\n", - " \"fRO\": 0.975\n", - " },\n", - " \"13\": {\n", - " \"T1\": 1.5012868688046168e-05,\n", - " \"T2\": 6.238808590084043e-06,\n", - " \"f1QRB\": 0.997924906562737,\n", - " \"f1QRB_std_err\": 9.068247000218935e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9960819770811921,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00020470342371224092,\n", - " \"fRO\": 0.9319999999999999\n", - " },\n", - " \"14\": {\n", - " \"T1\": 9.241177624502927e-06,\n", - " \"T2\": 1.2479145836656001e-05,\n", - " \"f1QRB\": 0.9989037419145974,\n", - " \"f1QRB_std_err\": 7.483443152934302e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9899718004895154,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0004595459103652275,\n", - " \"fRO\": 0.9410000000000001\n", - " },\n", - " \"15\": {\n", - " \"T1\": 1.3607903689853045e-05,\n", - " \"T2\": 1.2713607419342696e-05,\n", - " \"f1QRB\": 0.9983943409536015,\n", - " \"f1QRB_std_err\": 4.027027495615709e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9929483241808174,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00023770765814441926,\n", - " \"fRO\": 0.945\n", - " },\n", - " \"16\": {\n", - " \"T1\": 1.88513673725692e-05,\n", - " \"T2\": 4.7270850455358685e-06,\n", - " \"f1QRB\": 0.9987853652052536,\n", - " \"f1QRB_std_err\": 3.375389696164912e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9833505453505913,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0009000282675945473,\n", - " \"fRO\": 0.845\n", - " },\n", - " \"17\": {\n", - " \"T1\": 6.727376139504448e-06,\n", - " \"T2\": 1.3290167565629393e-05,\n", - " \"f1QRB\": 0.9988148862501292,\n", - " \"f1QRB_std_err\": 4.965553483148904e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9971513895552646,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00011975972016416049,\n", - " \"fRO\": 0.871\n", - " },\n", - " \"18\": {\n", - " \"T1\": 1.3370961985133656e-05,\n", - " \"T2\": 1.4781911797622444e-05,\n", - " \"f1QRB\": 0.9988395481906874,\n", - " \"f1QRB_std_err\": 3.334202920860159e-05,\n", - " \"f1Q_simultaneous_RB\": 0.991212188518014,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0005735243624384439,\n", - " \"fRO\": 0.9450000000000001\n", - " },\n", - " \"19\": {\n", - " \"T1\": 1.3694445091389104e-05,\n", - " \"T2\": 1.8948746412036046e-05,\n", - " \"f1QRB\": 0.9989032737033892,\n", - " \"f1QRB_std_err\": 2.1809754472271395e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9377408142450181,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.022945728139192902,\n", - " \"fRO\": 0.86\n", - " },\n", - " \"2\": {\n", - " \"T1\": 1.2858591189370053e-05,\n", - " \"T2\": 1.6878980942888143e-05,\n", - " \"f1QRB\": 0.9984345619163735,\n", - " \"f1QRB_std_err\": 9.08541980198589e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9894961138887621,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0010389843019420724,\n", - " \"fRO\": 0.9079999999999999\n", - " },\n", - " \"20\": {\n", - " \"T1\": 1.4033755270253051e-05,\n", - " \"T2\": 2.417434951047098e-05,\n", - " \"f1QRB\": 0.9984097828044537,\n", - " \"f1QRB_std_err\": 0.0001003650197355637,\n", - " \"f1Q_simultaneous_RB\": 0.9972607664140928,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0002625968643302963,\n", - " \"fRO\": 0.956\n", - " },\n", - " \"21\": {\n", - " \"T1\": 1.2585205427234064e-05,\n", - " \"T2\": 2.092706172954416e-05,\n", - " \"f1QRB\": 0.9987920931253695,\n", - " \"f1QRB_std_err\": 2.75729899097585e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9972438852563055,\n", - " \"f1Q_simultaneous_RB_std_err\": 4.7833914374202874e-05,\n", - " \"fRO\": 0.964\n", - " },\n", - " \"22\": {\n", - " \"T1\": 1.3156398816510328e-05,\n", - " \"T2\": 9.055428316830254e-06,\n", - " \"f1QRB\": 0.9987088311152464,\n", - " \"f1QRB_std_err\": 2.9284210923276044e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9882440316368954,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00217791143691248,\n", - " \"fRO\": 0.926\n", - " },\n", - " \"23\": {\n", - " \"T1\": 1.2842440379946409e-05,\n", - " \"T2\": 8.215052109680317e-06,\n", - " \"f1QRB\": 0.9974901751854006,\n", - " \"f1QRB_std_err\": 0.0001631397379850662,\n", - " \"f1Q_simultaneous_RB\": 0.9865011235636009,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0010189758801580672,\n", - " \"fRO\": 0.956\n", - " },\n", - " \"24\": {\n", - " \"T1\": 1.9346009082358398e-05,\n", - " \"T2\": 1.1937386114398276e-05,\n", - " \"f1QRB\": 0.9983253042496835,\n", - " \"f1QRB_std_err\": 8.067632036104494e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9950712793653935,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0002141642699176358,\n", - " \"fRO\": 0.979\n", - " },\n", - " \"25\": {\n", - " \"T1\": 1.1785048788788791e-05,\n", - " \"T2\": 1.4754448154974761e-05,\n", - " \"f1QRB\": 0.9979269962576733,\n", - " \"f1QRB_std_err\": 6.060664140314965e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9940890082252032,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0007016219504682814,\n", - " \"fRO\": 0.966\n", - " },\n", - " \"26\": {\n", - " \"T1\": 1.9757994068998704e-05,\n", - " \"T2\": 1.1786900530053712e-05,\n", - " \"f1QRB\": 0.9988929815534089,\n", - " \"f1QRB_std_err\": 2.8473648925082652e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9892190315759715,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0018571214358147484,\n", - " \"fRO\": 0.97\n", - " },\n", - " \"27\": {\n", - " \"T1\": 1.0772657302764382e-05,\n", - " \"T2\": 9.225720435722181e-06,\n", - " \"f1QRB\": 0.9982554695288404,\n", - " \"f1QRB_std_err\": 4.91454475921194e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9959353976666019,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00016001458516624184,\n", - " \"fRO\": 0.9139999999999999\n", - " },\n", - " \"28\": {\n", - " \"T1\": 9.981191636291515e-06,\n", - " \"T2\": 5.688781747165514e-06,\n", - " \"f1QRB\": 0.9983841943846401,\n", - " \"f1QRB_std_err\": 3.876665371947724e-05,\n", - " \"f1Q_simultaneous_RB\": 0.995992435403062,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00028985280637909165,\n", - " \"fRO\": 0.9410000000000001\n", - " },\n", - " \"29\": {\n", - " \"T1\": 1.1204638867006936e-05,\n", - " \"T2\": 1.652115287314364e-05,\n", - " \"f1QRB\": 0.9988150922713561,\n", - " \"f1QRB_std_err\": 8.275662897495279e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9952130715828645,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00034718794705519267,\n", - " \"fRO\": 0.925\n", - " },\n", - " \"3\": {\n", - " \"T1\": 1.8719464515731677e-05,\n", - " \"T2\": 1.4586748354157626e-05,\n", - " \"f1QRB\": 0.9989002998216094,\n", - " \"f1QRB_std_err\": 4.057304777251857e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9971535609092096,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0002838481061337756,\n", - " \"fRO\": 0.9239999999999999\n", - " },\n", - " \"30\": {\n", - " \"T1\": 1.244220399426232e-05,\n", - " \"T2\": 6.309696990610663e-06,\n", - " \"f1QRB\": 0.9984319024200233,\n", - " \"f1QRB_std_err\": 2.951110700225705e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9919021348796022,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0006326939371417978,\n", - " \"fRO\": 0.971\n", - " },\n", - " \"31\": {\n", - " \"T1\": 1.3062804950546854e-05,\n", - " \"T2\": 1.400102486517304e-05,\n", - " \"f1QRB\": 0.998674284285232,\n", - " \"f1QRB_std_err\": 4.043660607731187e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9916620995172601,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0002275290208907156,\n", - " \"fRO\": 0.948\n", - " },\n", - " \"32\": {\n", - " \"T1\": 1.4563700515623286e-05,\n", - " \"T2\": 1.3020747686044575e-05,\n", - " \"f1QRB\": 0.9987025319481753,\n", - " \"f1QRB_std_err\": 4.946986179999276e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9964784937971644,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00014781010102640516,\n", - " \"fRO\": 0.959\n", - " },\n", - " \"33\": {\n", - " \"T1\": 9.642732018105618e-06,\n", - " \"T2\": 1.3634615127933523e-05,\n", - " \"f1QRB\": 0.9980203558684193,\n", - " \"f1QRB_std_err\": 2.9295348076164842e-05,\n", - " \"f1Q_simultaneous_RB\": 0.983196638552863,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.002055539485119557,\n", - " \"fRO\": 0.918\n", - " },\n", - " \"34\": {\n", - " \"T1\": 1.713988970837948e-05,\n", - " \"T2\": 2.198751603734416e-05,\n", - " \"f1QRB\": 0.9990015818488835,\n", - " \"f1QRB_std_err\": 3.0424905769125453e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9813599244580338,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.004669744757842596,\n", - " \"fRO\": 0.968\n", - " },\n", - " \"35\": {\n", - " \"T1\": 1.4643912131398986e-05,\n", - " \"T2\": 3.1995577640178207e-06,\n", - " \"f1QRB\": 0.9981762911688464,\n", - " \"f1QRB_std_err\": 6.418526794908951e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9900369543687392,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0005557840471862918,\n", - " \"fRO\": 0.94\n", - " },\n", - " \"36\": {\n", - " \"T1\": 1.1051624768642374e-05,\n", - " \"T2\": 1.400670235227901e-05,\n", - " \"f1QRB\": 0.9983832731371838,\n", - " \"f1QRB_std_err\": 4.427599186346774e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9923702291289735,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.000734496046659809,\n", - " \"fRO\": 0.925\n", - " },\n", - " \"37\": {\n", - " \"T1\": 9.952535549320594e-06,\n", - " \"T2\": 9.089917827707173e-06,\n", - " \"f1QRB\": 0.9982104621121981,\n", - " \"f1QRB_std_err\": 5.9621009368908024e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9928609905289468,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0002770065858464925,\n", - " \"fRO\": 0.97\n", - " },\n", - " \"38\": {\n", - " \"T1\": 1.4542547472158691e-05,\n", - " \"T2\": 4.9119555657954954e-06,\n", - " \"f1QRB\": 0.9983391239777049,\n", - " \"f1QRB_std_err\": 5.5489399743889144e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9927274464426054,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00034490346748517424,\n", - " \"fRO\": 0.94\n", - " },\n", - " \"39\": {\n", - " \"T1\": 1.5813082724142702e-06,\n", - " \"f1QRB\": 0.9837979672096584,\n", - " \"f1QRB_std_err\": 0.0015886479371489913,\n", - " \"f1Q_simultaneous_RB\": 0.9800825196376993,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0019705352672016725,\n", - " \"fRO\": 0.948\n", - " },\n", - " \"4\": {\n", - " \"T1\": 1.221600720686062e-05,\n", - " \"T2\": 5.032176434386599e-06,\n", - " \"f1QRB\": 0.9981697192213356,\n", - " \"f1QRB_std_err\": 5.148091906526168e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9955769056038452,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0002443674943745968,\n", - " \"fRO\": 0.85\n", - " },\n", - " \"40\": {\n", - " \"T1\": 1.3836774470224874e-05,\n", - " \"T2\": 8.820018932957046e-06,\n", - " \"f1QRB\": 0.9985359309310786,\n", - " \"f1QRB_std_err\": 0.00010011566667630272,\n", - " \"f1Q_simultaneous_RB\": 0.991993880228863,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0011854776333122688,\n", - " \"fRO\": 0.868\n", - " },\n", - " \"41\": {\n", - " \"T1\": 1.2013952104481512e-05,\n", - " \"T2\": 1.9147440617148604e-05,\n", - " \"f1QRB\": 0.9988626781522412,\n", - " \"f1QRB_std_err\": 3.519955021416773e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9976416856190857,\n", - " \"f1Q_simultaneous_RB_std_err\": 7.139971507238868e-05,\n", - " \"fRO\": 0.98\n", - " },\n", - " \"42\": {\n", - " \"T1\": 1.1897315657421982e-05,\n", - " \"T2\": 6.433810612334841e-06,\n", - " \"f1QRB\": 0.9987401398855629,\n", - " \"f1QRB_std_err\": 2.4842910954783737e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9886404187567864,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.000865545671861028,\n", - " \"fRO\": 0.9199999999999999\n", - " },\n", - " \"43\": {\n", - " \"T1\": 1.175387778291488e-05,\n", - " \"T2\": 1.802576931646561e-05,\n", - " \"f1QRB\": 0.998980656920372,\n", - " \"f1QRB_std_err\": 3.047618557903109e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9966245346548614,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00012825235793464645,\n", - " \"fRO\": 0.897\n", - " },\n", - " \"44\": {\n", - " \"T1\": 1.1317533527705256e-05,\n", - " \"T2\": 7.025124023453061e-06,\n", - " \"f1QRB\": 0.9984936994107011,\n", - " \"f1QRB_std_err\": 1.9566171677975698e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9895156725495968,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0013520876714959414,\n", - " \"fRO\": 0.9430000000000001\n", - " },\n", - " \"45\": {\n", - " \"T1\": 1.3916136806546354e-05,\n", - " \"T2\": 8.54200445611926e-06,\n", - " \"f1QRB\": 0.9981938832438657,\n", - " \"f1QRB_std_err\": 7.720752371573168e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9951756210242256,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0001656578200493323,\n", - " \"fRO\": 0.883\n", - " },\n", - " \"46\": {\n", - " \"T1\": 1.6800993490267442e-05,\n", - " \"T2\": 1.390596693008661e-05,\n", - " \"f1QRB\": 0.9989904172217673,\n", - " \"f1QRB_std_err\": 0.00020792543430694119,\n", - " \"f1Q_simultaneous_RB\": 0.9740486054627526,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.003949225214890666,\n", - " \"fRO\": 0.935\n", - " },\n", - " \"47\": {\n", - " \"T1\": 2.308141076017859e-05,\n", - " \"T2\": 1.2889928165515491e-05,\n", - " \"f1QRB\": 0.9989701426764845,\n", - " \"f1QRB_std_err\": 3.549452729438895e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9936809932934392,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0005194840701065176,\n", - " \"fRO\": 0.966\n", - " },\n", - " \"48\": {\n", - " \"T1\": 2.4482424062851024e-05,\n", - " \"T2\": 1.968317056642545e-05,\n", - " \"f1QRB\": 0.998901164295319,\n", - " \"f1QRB_std_err\": 1.8909296638901778e-05,\n", - " \"f1Q_simultaneous_RB\": 0.997621217085471,\n", - " \"f1Q_simultaneous_RB_std_err\": 7.677949592921175e-05,\n", - " \"fRO\": 0.968\n", - " },\n", - " \"49\": {\n", - " \"T1\": 1.0015289971656016e-05,\n", - " \"T2\": 1.7014007307228258e-05,\n", - " \"f1QRB\": 0.9984258277322864,\n", - " \"f1QRB_std_err\": 5.47736816118378e-05,\n", - " \"f1Q_simultaneous_RB\": 0.995728017290028,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00015382936372201333,\n", - " \"fRO\": 0.908\n", - " },\n", - " \"5\": {\n", - " \"T1\": 1.3004498440941119e-05,\n", - " \"T2\": 1.6383805633386163e-05,\n", - " \"f1QRB\": 0.9986470862124049,\n", - " \"f1QRB_std_err\": 3.652268864366153e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9929592980797504,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00040364203755640396,\n", - " \"fRO\": 0.973\n", - " },\n", - " \"50\": {\n", - " \"T1\": 1.3464075894863434e-05,\n", - " \"T2\": 5.574754214725209e-06,\n", - " \"f1QRB\": 0.998431790229616,\n", - " \"f1QRB_std_err\": 6.748661568443685e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9959289209104987,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00014670291611745554,\n", - " \"fRO\": 0.9410000000000001\n", - " },\n", - " \"51\": {\n", - " \"T1\": 6.707631008093091e-06,\n", - " \"T2\": 1.558251977239244e-05,\n", - " \"f1QRB\": 0.9988574376159899,\n", - " \"f1QRB_std_err\": 2.2201834762021872e-05,\n", - " \"f1Q_simultaneous_RB\": 0.996977835871332,\n", - " \"f1Q_simultaneous_RB_std_err\": 5.7777036449914484e-05,\n", - " \"fRO\": 0.974\n", - " },\n", - " \"52\": {\n", - " \"T1\": 1.0876444082164132e-05,\n", - " \"T2\": 8.302581019140548e-06,\n", - " \"f1QRB\": 0.99839829160568,\n", - " \"f1QRB_std_err\": 3.717861285133706e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9933032810947588,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.000529988652814212,\n", - " \"fRO\": 0.959\n", - " },\n", - " \"53\": {\n", - " \"T1\": 1.3108836298338454e-05,\n", - " \"T2\": 1.0337667528829016e-05,\n", - " \"f1QRB\": 0.9984238159933861,\n", - " \"f1QRB_std_err\": 5.2899593808349486e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9954968598641998,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0003350853484652073,\n", - " \"fRO\": 0.9179999999999999\n", - " },\n", - " \"54\": {\n", - " \"T1\": 1.2661827615430663e-05,\n", - " \"T2\": 1.4628180000985567e-05,\n", - " \"f1QRB\": 0.9984776311382394,\n", - " \"f1QRB_std_err\": 4.138291986479403e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9897788402240421,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0015090359441196236,\n", - " \"fRO\": 0.944\n", - " },\n", - " \"55\": {\n", - " \"T1\": 6.350408716879262e-06,\n", - " \"T2\": 5.401443542130627e-06,\n", - " \"f1QRB\": 0.9976392604241605,\n", - " \"f1QRB_std_err\": 4.848970175188756e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9953757916042162,\n", - " \"f1Q_simultaneous_RB_std_err\": 4.183999712958921e-05,\n", - " \"fRO\": 0.98\n", - " },\n", - " \"56\": {\n", - " \"T1\": 2.067563472320421e-05,\n", - " \"T2\": 1.0673230508596336e-05,\n", - " \"f1QRB\": 0.9971488473112687,\n", - " \"f1QRB_std_err\": 0.00015874611974747805,\n", - " \"f1Q_simultaneous_RB\": 0.9936475546766723,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00019979052355938962,\n", - " \"fRO\": 0.9339999999999999\n", - " },\n", - " \"57\": {\n", - " \"T1\": 1.3158675098459701e-05,\n", - " \"T2\": 1.737248082358324e-05,\n", - " \"f1QRB\": 0.9980657064974754,\n", - " \"f1QRB_std_err\": 4.2934019506785746e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9816962799151328,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0014092574130662233,\n", - " \"fRO\": 0.9099999999999999\n", - " },\n", - " \"58\": {\n", - " \"T1\": 2.877245453838103e-05,\n", - " \"T2\": 1.7015583307912096e-05,\n", - " \"f1QRB\": 0.9986684576929438,\n", - " \"f1QRB_std_err\": 3.1730303092790445e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9975652149478694,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00032303779596305114,\n", - " \"fRO\": 0.946\n", - " },\n", - " \"59\": {\n", - " \"T1\": 1.160848612530693e-05,\n", - " \"T2\": 5.767198803832716e-06,\n", - " \"f1QRB\": 0.998377983141542,\n", - " \"f1QRB_std_err\": 4.5643609775957636e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9676348487178844,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.004328527980352748,\n", - " \"fRO\": 0.873\n", - " },\n", - " \"6\": {\n", - " \"T1\": 1.8239370061508387e-05,\n", - " \"T2\": 5.5417359798717045e-06,\n", - " \"f1QRB\": 0.9979075823351948,\n", - " \"f1QRB_std_err\": 0.00015227406343373901,\n", - " \"f1Q_simultaneous_RB\": 0.9974405105945053,\n", - " \"f1Q_simultaneous_RB_std_err\": 6.156481629598492e-05,\n", - " \"fRO\": 0.963\n", - " },\n", - " \"60\": {\n", - " \"T1\": 8.927064763984261e-06,\n", - " \"T2\": 9.50878568524798e-06,\n", - " \"f1QRB\": 0.9979692265193538,\n", - " \"f1QRB_std_err\": 7.168583097486353e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9851982972890478,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0008258052575669145,\n", - " \"fRO\": 0.969\n", - " },\n", - " \"61\": {\n", - " \"T1\": 1.2053050762532225e-05,\n", - " \"T2\": 1.0969753526041124e-05,\n", - " \"f1QRB\": 0.9984267839080629,\n", - " \"f1QRB_std_err\": 4.9647881711067385e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9755784741860619,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.005164330252092108,\n", - " \"fRO\": 0.881\n", - " },\n", - " \"62\": {\n", - " \"T1\": 1.7808351268249727e-05,\n", - " \"T2\": 2.0935454437796016e-05,\n", - " \"f1QRB\": 0.9988293622267578,\n", - " \"f1QRB_std_err\": 3.1724238532503364e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9952212272657633,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0001335378001105945,\n", - " \"fRO\": 0.944\n", - " },\n", - " \"63\": {\n", - " \"T1\": 1.9533544910252338e-05,\n", - " \"T2\": 8.225690384500153e-06,\n", - " \"f1QRB\": 0.9990818104537923,\n", - " \"f1QRB_std_err\": 2.591163591836797e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9976971801778179,\n", - " \"f1Q_simultaneous_RB_std_err\": 6.06654368005454e-05,\n", - " \"fRO\": 0.965\n", - " },\n", - " \"64\": {\n", - " \"T1\": 5.3259203473510294e-06,\n", - " \"T2\": 8.466173528335672e-06,\n", - " \"f1QRB\": 0.9984190186400348,\n", - " \"f1QRB_std_err\": 6.448407276294968e-05,\n", - " \"f1Q_simultaneous_RB\": 0.993011458055223,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0003924719541656447,\n", - " \"fRO\": 0.967\n", - " },\n", - " \"65\": {\n", - " \"T1\": 1.6258689130380103e-05,\n", - " \"T2\": 2.13610227524408e-05,\n", - " \"f1QRB\": 0.9989444357536232,\n", - " \"f1QRB_std_err\": 3.225989961221664e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9915636857510693,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0009472909244109095,\n", - " \"fRO\": 0.957\n", - " },\n", - " \"66\": {\n", - " \"T1\": 9.392627467562096e-06,\n", - " \"T2\": 8.92037605247448e-06,\n", - " \"f1QRB\": 0.9971650906144066,\n", - " \"f1QRB_std_err\": 0.0002669885055081551,\n", - " \"f1Q_simultaneous_RB\": 0.9632084176103134,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.004999298462372134,\n", - " \"fRO\": 0.786\n", - " },\n", - " \"67\": {\n", - " \"T1\": 1.0798303446079845e-05,\n", - " \"T2\": 1.442063080948124e-05,\n", - " \"f1QRB\": 0.9973961036972676,\n", - " \"f1QRB_std_err\": 0.00015345056365693833,\n", - " \"f1Q_simultaneous_RB\": 0.9807334968408162,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.002467546876349839,\n", - " \"fRO\": 0.871\n", - " },\n", - " \"68\": {\n", - " \"T1\": 1.528570986098691e-05,\n", - " \"T2\": 1.8660128795817277e-05,\n", - " \"f1QRB\": 0.9986868558246939,\n", - " \"f1QRB_std_err\": 5.381485644969931e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9757941434467859,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.006272810344326621,\n", - " \"fRO\": 0.9470000000000001\n", - " },\n", - " \"69\": {\n", - " \"T1\": 1.1718733631190332e-05,\n", - " \"T2\": 1.2067305674627332e-05,\n", - " \"f1QRB\": 0.9983299165088875,\n", - " \"f1QRB_std_err\": 4.875324178348875e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9959091496878513,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00016641915211360384,\n", - " \"fRO\": 0.9570000000000001\n", - " },\n", - " \"7\": {\n", - " \"T1\": 1.2203293820996904e-05,\n", - " \"T2\": 1.1632142317843116e-05,\n", - " \"f1QRB\": 0.998594898155075,\n", - " \"f1QRB_std_err\": 4.437384879873306e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9920859423780137,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0001805274048861091,\n", - " \"fRO\": 0.8979999999999999\n", - " },\n", - " \"70\": {\n", - " \"T1\": 1.23265203941526e-05,\n", - " \"T2\": 1.4719675933248264e-05,\n", - " \"f1QRB\": 0.9957792734843232,\n", - " \"f1QRB_std_err\": 0.00011750342197300224,\n", - " \"f1Q_simultaneous_RB\": 0.9970195422483246,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00016257128630305394,\n", - " \"fRO\": 0.976\n", - " },\n", - " \"71\": {\n", - " \"T1\": 1.583166332685028e-05,\n", - " \"T2\": 1.0856584979564591e-05,\n", - " \"f1QRB\": 0.9988470538918773,\n", - " \"f1QRB_std_err\": 6.0616375932213985e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9944350325795311,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00022116553019116896,\n", - " \"fRO\": 0.935\n", - " },\n", - " \"72\": {\n", - " \"T1\": 1.397358025395872e-05,\n", - " \"T2\": 1.8038754185674848e-05,\n", - " \"f1QRB\": 0.998568335008464,\n", - " \"f1QRB_std_err\": 6.054024131315892e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9849382823361392,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0013193296910071872,\n", - " \"fRO\": 0.974\n", - " },\n", - " \"73\": {\n", - " \"T1\": 1.1814906860408034e-05,\n", - " \"T2\": 8.825378096259247e-06,\n", - " \"f1QRB\": 0.9986812770773348,\n", - " \"f1QRB_std_err\": 4.031007930552348e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9873569114178359,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0009465125255858361,\n", - " \"fRO\": 0.957\n", - " },\n", - " \"74\": {\n", - " \"T1\": 1.8084856207509896e-05,\n", - " \"fRO\": 0.755\n", - " },\n", - " \"75\": {\n", - " \"T1\": 1.4599833718085063e-05,\n", - " \"T2\": 1.1762851405305077e-05,\n", - " \"f1QRB\": 0.998681824839147,\n", - " \"f1QRB_std_err\": 5.203226380860018e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9966864148141727,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0001278973109537322,\n", - " \"fRO\": 0.925\n", - " },\n", - " \"76\": {\n", - " \"T1\": 1.2786019802371923e-05,\n", - " \"T2\": 1.3142506452619197e-05,\n", - " \"f1QRB\": 0.9984067210095231,\n", - " \"f1QRB_std_err\": 5.331170411991985e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9942480052610472,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0005965011211577004,\n", - " \"fRO\": 0.964\n", - " },\n", - " \"77\": {\n", - " \"T1\": 3.079908884466668e-06,\n", - " \"T2\": 2.801177738273383e-06,\n", - " \"f1QRB\": 0.9945030681325627,\n", - " \"f1QRB_std_err\": 0.0001248838776475144,\n", - " \"f1Q_simultaneous_RB\": 0.9804732182715379,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0012486362086174888,\n", - " \"fRO\": 0.87\n", - " },\n", - " \"78\": {\n", - " \"T1\": 1.1244811327974159e-05,\n", - " \"T2\": 3.875097528754643e-06,\n", - " \"f1QRB\": 0.9983398650728867,\n", - " \"f1QRB_std_err\": 7.633315759862269e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9967692098406119,\n", - " \"f1Q_simultaneous_RB_std_err\": 7.424979279055196e-05,\n", - " \"fRO\": 0.903\n", - " },\n", - " \"79\": {\n", - " \"T1\": 5.6610288866255496e-06,\n", - " \"T2\": 8.629153961885565e-06,\n", - " \"f1QRB\": 0.9974617497608826,\n", - " \"f1QRB_std_err\": 2.781955255112645e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9958201350429458,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00013111493060712456,\n", - " \"fRO\": 0.948\n", - " },\n", - " \"8\": {\n", - " \"T1\": 1.1407003611118413e-05,\n", - " \"T2\": 1.2309370432467166e-05,\n", - " \"f1QRB\": 0.9987758357419216,\n", - " \"f1QRB_std_err\": 4.789620643962214e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9884117906966723,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.000709450806904051,\n", - " \"fRO\": 0.9490000000000001\n", - " },\n", - " \"80\": {\n", - " \"T1\": 5.978238576247811e-06,\n", - " \"T2\": 7.791064949482855e-06,\n", - " \"f1QRB\": 0.9975287511006907,\n", - " \"f1QRB_std_err\": 9.601258779724653e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9957053001975825,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00011365614144994835,\n", - " \"fRO\": 0.966\n", - " },\n", - " \"81\": {\n", - " \"T1\": 3.4310599698402173e-06,\n", - " \"T2\": 4.538643667345167e-06,\n", - " \"f1QRB\": 0.9701806785928798,\n", - " \"f1QRB_std_err\": 0.003063576918154014,\n", - " \"f1Q_simultaneous_RB\": 0.9645298408956499,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0035177577054300957,\n", - " \"fRO\": 0.881\n", - " },\n", - " \"82\": {\n", - " \"T1\": 1.1019548872967793e-05,\n", - " \"T2\": 1.3065749102731945e-05,\n", - " \"f1QRB\": 0.9984547839403882,\n", - " \"f1QRB_std_err\": 3.675749841499251e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9968747556504615,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.00012065576365671228,\n", - " \"fRO\": 0.963\n", - " },\n", - " \"83\": {\n", - " \"T1\": 1.090475453998459e-05,\n", - " \"T2\": 1.5393165671024967e-05,\n", - " \"f1QRB\": 0.9985743375675988,\n", - " \"f1QRB_std_err\": 4.7535691835826344e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9941849216547207,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.0006464784829884674,\n", - " \"fRO\": 0.972\n", - " },\n", - " \"9\": {\n", - " \"T1\": 9.785771028586126e-06,\n", - " \"T2\": 1.4090887380268008e-05,\n", - " \"f1QRB\": 0.9985960431813231,\n", - " \"f1QRB_std_err\": 4.30889189756182e-05,\n", - " \"f1Q_simultaneous_RB\": 0.9847208740742583,\n", - " \"f1Q_simultaneous_RB_std_err\": 0.001365107107806661,\n", - " \"fRO\": 0.945\n", - " }\n", - " },\n", - " \"2Q\": {\n", - " \"0-1\": {\n", - " \"fISWAP\": 0.9791302135165144,\n", - " \"fISWAP_std_err\": 0.00356371284654979\n", - " },\n", - " \"0-7\": {\n", - " \"fISWAP\": 0.9735136820907221,\n", - " \"fISWAP_std_err\": 0.005528756208824819\n", - " },\n", - " \"1-2\": {\n", - " \"fISWAP\": 0.9826670815072358,\n", - " \"fISWAP_std_err\": 0.004545721578955407\n", - " },\n", - " \"1-8\": {\n", - " \"fISWAP\": 0.9871636453178825,\n", - " \"fISWAP_std_err\": 0.0015318956008649608\n", - " },\n", - " \"10-11\": {\n", - " \"fISWAP\": 0.9608092769094925,\n", - " \"fISWAP_std_err\": 0.006832379421744852\n", - " },\n", - " \"10-17\": {\n", - " \"fISWAP\": 0.9175335256563664,\n", - " \"fISWAP_std_err\": 0.014230349601250074\n", - " },\n", - " \"11-12\": {\n", - " \"fISWAP\": 0.9653965261238255,\n", - " \"fISWAP_std_err\": 0.004074194576367181\n", - " },\n", - " \"11-18\": {\n", - " \"fISWAP\": 0.9827028393277744,\n", - " \"fISWAP_std_err\": 0.00719682143391899\n", - " },\n", - " \"12-13\": {\n", - " \"fISWAP\": 0.9860621874682959,\n", - " \"fISWAP_std_err\": 0.0016004359788634186\n", - " },\n", - " \"12-19\": {\n", - " \"fISWAP\": 0.9826169461521911,\n", - " \"fISWAP_std_err\": 0.0024860949331014254\n", - " },\n", - " \"13-20\": {\n", - " \"fISWAP\": 0.8992886975557597,\n", - " \"fISWAP_std_err\": 0.009522823050077288\n", - " },\n", - " \"14-15\": {\n", - " \"fISWAP\": 0.9176834388222596,\n", - " \"fISWAP_std_err\": 0.018092341455944\n", - " },\n", - " \"14-21\": {\n", - " \"fISWAP\": 0.9694771126842667,\n", - " \"fISWAP_std_err\": 0.003332132287104312\n", - " },\n", - " \"15-22\": {\n", - " \"fISWAP\": 0.9592408936940807,\n", - " \"fISWAP_std_err\": 0.006077022692492429\n", - " },\n", - " \"16-17\": {\n", - " \"fISWAP\": 0.9812012158724508,\n", - " \"fISWAP_std_err\": 0.004048459654837136\n", - " },\n", - " \"16-23\": {\n", - " \"fISWAP\": 0.5,\n", - " \"fISWAP_std_err\": 1.0\n", - " },\n", - " \"17-18\": {\n", - " \"fISWAP\": 0.9637999630059566,\n", - " \"fISWAP_std_err\": 0.007420641423514777\n", - " },\n", - " \"17-24\": {\n", - " \"fISWAP\": 0.9615095487981369,\n", - " \"fISWAP_std_err\": 0.0038152493178914048\n", - " },\n", - " \"18-19\": {\n", - " \"fISWAP\": 0.9624441046403442,\n", - " \"fISWAP_std_err\": 0.005903445677963392\n", - " },\n", - " \"18-25\": {\n", - " \"fISWAP\": 0.9640020475890487,\n", - " \"fISWAP_std_err\": 0.005958170516256149\n", - " },\n", - " \"19-20\": {\n", - " \"fISWAP\": 0.9753775134174749,\n", - " \"fISWAP_std_err\": 0.0030206413985383934\n", - " },\n", - " \"19-26\": {\n", - " \"fISWAP\": 0.9738883062816561,\n", - " \"fISWAP_std_err\": 0.0028133311282072795\n", - " },\n", - " \"2-3\": {\n", - " \"fISWAP\": 0.9761701890350708,\n", - " \"fISWAP_std_err\": 0.003984418130874122\n", - " },\n", - " \"2-9\": {\n", - " \"fISWAP\": 0.9878078152606788,\n", - " \"fISWAP_std_err\": 0.001604514158154127\n", - " },\n", - " \"20-27\": {\n", - " \"fISWAP\": 0.972527548688719,\n", - " \"fISWAP_std_err\": 0.005177397542386951\n", - " },\n", - " \"21-22\": {\n", - " \"fISWAP\": 0.9861867762396699,\n", - " \"fISWAP_std_err\": 0.0049924774137807245\n", - " },\n", - " \"21-28\": {\n", - " \"fISWAP\": 0.9875653043190505,\n", - " \"fISWAP_std_err\": 0.0020140206155346146\n", - " },\n", - " \"22-23\": {\n", - " \"fCZ\": 0.8131204267839887,\n", - " \"fCZ_std_err\": 0.023753498043183205,\n", - " \"fISWAP\": 0.9623701423788883,\n", - " \"fISWAP_std_err\": 0.00921488479505151\n", - " },\n", - " \"22-29\": {\n", - " \"fCZ\": 0.9553762383380866,\n", - " \"fCZ_std_err\": 0.008598180865132431,\n", - " \"fISWAP\": 0.9805701902071962,\n", - " \"fISWAP_std_err\": 0.0021701820410876095\n", - " },\n", - " \"23-24\": {\n", - " \"fCZ\": 0.9451155859277102,\n", - " \"fCZ_std_err\": 0.010411710027468532,\n", - " \"fISWAP\": 0.9768005265055224,\n", - " \"fISWAP_std_err\": 0.007770529050118395\n", - " },\n", - " \"23-30\": {\n", - " \"fCZ\": 0.9243983539104479,\n", - " \"fCZ_std_err\": 0.01802145417629321,\n", - " \"fISWAP\": 0.902738673879681,\n", - " \"fISWAP_std_err\": 0.006818833985233317\n", - " },\n", - " \"24-25\": {\n", - " \"fISWAP\": 0.9628007312892574,\n", - " \"fISWAP_std_err\": 0.003733949142578766\n", - " },\n", - " \"24-31\": {\n", - " \"fCZ\": 0.9896366048500892,\n", - " \"fCZ_std_err\": 0.00416104817282723,\n", - " \"fISWAP\": 0.9848767370537788,\n", - " \"fISWAP_std_err\": 0.0019422978529865585\n", - " },\n", - " \"25-26\": {\n", - " \"fISWAP\": 0.9683010306523239,\n", - " \"fISWAP_std_err\": 0.006305001630825598\n", - " },\n", - " \"25-32\": {\n", - " \"fISWAP\": 0.972785202975738,\n", - " \"fISWAP_std_err\": 0.004114423288032952\n", - " },\n", - " \"26-33\": {\n", - " \"fISWAP\": 0.9378890801422842,\n", - " \"fISWAP_std_err\": 0.010579261945524422\n", - " },\n", - " \"27-34\": {\n", - " \"fISWAP\": 0.9716219949788273,\n", - " \"fISWAP_std_err\": 0.003575681758071341\n", - " },\n", - " \"28-29\": {\n", - " \"fISWAP\": 0.9788494799023928,\n", - " \"fISWAP_std_err\": 0.0024364897527115585\n", - " },\n", - " \"28-35\": {\n", - " \"fISWAP\": 0.9639919058547002,\n", - " \"fISWAP_std_err\": 0.005405937189237481\n", - " },\n", - " \"29-30\": {\n", - " \"fCZ\": 0.9454242154413506,\n", - " \"fCZ_std_err\": 0.016219616156322496,\n", - " \"fISWAP\": 0.9778419678547438,\n", - " \"fISWAP_std_err\": 0.0016218686403212568\n", - " },\n", - " \"29-36\": {\n", - " \"fCZ\": 0.9835938239986446,\n", - " \"fCZ_std_err\": 0.003179043982604907,\n", - " \"fISWAP\": 0.9810825021956864,\n", - " \"fISWAP_std_err\": 0.004467142809673723\n", - " },\n", - " \"3-10\": {\n", - " \"fISWAP\": 0.9226230525066166,\n", - " \"fISWAP_std_err\": 0.008862475076832018\n", - " },\n", - " \"3-4\": {\n", - " \"fISWAP\": 0.9506201610747482,\n", - " \"fISWAP_std_err\": 0.006391161335644611\n", - " },\n", - " \"30-31\": {\n", - " \"fCZ\": 0.9782743632580108,\n", - " \"fCZ_std_err\": 0.003166566866056771,\n", - " \"fISWAP\": 0.9263920544692568,\n", - " \"fISWAP_std_err\": 0.012427788613003463\n", - " },\n", - " \"30-37\": {\n", - " \"fCZ\": 0.9381541716478992,\n", - " \"fCZ_std_err\": 0.011268263014875242,\n", - " \"fISWAP\": 0.988775694984386,\n", - " \"fISWAP_std_err\": 0.002369041711260937\n", - " },\n", - " \"31-32\": {\n", - " \"fCZ\": 0.97272030660307,\n", - " \"fCZ_std_err\": 0.0024880579085394304,\n", - " \"fISWAP\": 0.9777788392342968,\n", - " \"fISWAP_std_err\": 0.0028554362838577162\n", - " },\n", - " \"31-38\": {\n", - " \"fCZ\": 0.923589367568092,\n", - " \"fCZ_std_err\": 0.021497651582702258,\n", - " \"fISWAP\": 0.972427206095531,\n", - " \"fISWAP_std_err\": 0.002652465123841745\n", - " },\n", - " \"32-33\": {\n", - " \"fCZ\": 0.95823427800913,\n", - " \"fCZ_std_err\": 0.00446983618513398,\n", - " \"fISWAP\": 0.9794392126964651,\n", - " \"fISWAP_std_err\": 0.003170561763187578\n", - " },\n", - " \"32-39\": {\n", - " \"fCZ\": 0.9676193940962202,\n", - " \"fCZ_std_err\": 0.012180955656225673,\n", - " \"fISWAP\": 0.9471116565923102,\n", - " \"fISWAP_std_err\": 0.009485438714608638\n", - " },\n", - " \"33-34\": {\n", - " \"fISWAP\": 0.9791790005234218,\n", - " \"fISWAP_std_err\": 0.00434310763839065\n", - " },\n", - " \"33-40\": {\n", - " \"fCZ\": 0.5,\n", - " \"fCZ_std_err\": 1.0,\n", - " \"fISWAP\": 0.9836773772871124,\n", - " \"fISWAP_std_err\": 0.002413077893821505\n", - " },\n", - " \"34-41\": {\n", - " \"fISWAP\": 0.981208304769087,\n", - " \"fISWAP_std_err\": 0.0035818793671928296\n", - " },\n", - " \"35-36\": {\n", - " \"fCZ\": 0.5,\n", - " \"fCZ_std_err\": 1.0,\n", - " \"fISWAP\": 0.9363437120389613,\n", - " \"fISWAP_std_err\": 0.008771122408902885\n", - " },\n", - " \"35-42\": {\n", - " \"fCZ\": 0.5,\n", - " \"fCZ_std_err\": 1.0,\n", - " \"fISWAP\": 0.963098994577651,\n", - " \"fISWAP_std_err\": 0.0065455200479871065\n", - " },\n", - " \"36-37\": {\n", - " \"fCZ\": 0.9859932126721338,\n", - " \"fCZ_std_err\": 0.002265311115309427,\n", - " \"fISWAP\": 0.9393376252029916,\n", - " \"fISWAP_std_err\": 0.01064729584032537\n", - " },\n", - " \"36-43\": {\n", - " \"fCZ\": 0.9834422568445816,\n", - " \"fCZ_std_err\": 0.002149164215421339,\n", - " \"fISWAP\": 0.9819326300244948,\n", - " \"fISWAP_std_err\": 0.0028825293231968755\n", - " },\n", - " \"37-38\": {\n", - " \"fCZ\": 0.9730964409560557,\n", - " \"fCZ_std_err\": 0.007166947898501174,\n", - " \"fISWAP\": 0.8732615841593578,\n", - " \"fISWAP_std_err\": 0.008164821791420175\n", - " },\n", - " \"37-44\": {\n", - " \"fCZ\": 0.9898899788690768,\n", - " \"fCZ_std_err\": 0.0026127128645217013,\n", - " \"fISWAP\": 0.95157000198181,\n", - " \"fISWAP_std_err\": 0.005210452797842842\n", - " },\n", - " \"38-39\": {\n", - " \"fCZ\": 0.9152105518588706,\n", - " \"fCZ_std_err\": 0.018250356740116366,\n", - " \"fISWAP\": 0.9342088023346795,\n", - " \"fISWAP_std_err\": 0.006850634509083431\n", - " },\n", - " \"38-45\": {\n", - " \"fCZ\": 0.9345038340266254,\n", - " \"fCZ_std_err\": 0.014340313680079155,\n", - " \"fISWAP\": 0.8829262365164003,\n", - " \"fISWAP_std_err\": 0.016002126804853644\n", - " },\n", - " \"39-40\": {\n", - " \"fCZ\": 0.5,\n", - " \"fCZ_std_err\": 1.0,\n", - " \"fISWAP\": 0.9067660927446799,\n", - " \"fISWAP_std_err\": 0.007506787004908315\n", - " },\n", - " \"39-46\": {\n", - " \"fCZ\": 0.9117021474358413,\n", - " \"fCZ_std_err\": 0.019598451429119576,\n", - " \"fISWAP\": 0.9380858079746697,\n", - " \"fISWAP_std_err\": 0.00302266999144198\n", - " },\n", - " \"4-11\": {\n", - " \"fISWAP\": 0.9818165214983766,\n", - " \"fISWAP_std_err\": 0.0028171535523083178\n", - " },\n", - " \"4-5\": {\n", - " \"fISWAP\": 0.9799723111363947,\n", - " \"fISWAP_std_err\": 0.0023228402056086565\n", - " },\n", - " \"40-41\": {\n", - " \"fISWAP\": 0.8810830889606438,\n", - " \"fISWAP_std_err\": 0.04657399521192064\n", - " },\n", - " \"40-47\": {\n", - " \"fISWAP\": 0.9631231044654014,\n", - " \"fISWAP_std_err\": 0.004048391808971318\n", - " },\n", - " \"41-48\": {\n", - " \"fISWAP\": 0.9790577712837368,\n", - " \"fISWAP_std_err\": 0.001782511729009955\n", - " },\n", - " \"42-43\": {\n", - " \"fCZ\": 0.9573836076319032,\n", - " \"fCZ_std_err\": 0.008312305696217399,\n", - " \"fISWAP\": 0.9856361593139336,\n", - " \"fISWAP_std_err\": 0.004423360979212322\n", - " },\n", - " \"42-49\": {\n", - " \"fISWAP\": 0.8912119775523908,\n", - " \"fISWAP_std_err\": 0.014181359136284818\n", - " },\n", - " \"43-44\": {\n", - " \"fCZ\": 0.976542427162598,\n", - " \"fCZ_std_err\": 0.0073970381416081105,\n", - " \"fISWAP\": 0.9651377004532156,\n", - " \"fISWAP_std_err\": 0.003567681556245753\n", - " },\n", - " \"43-50\": {\n", - " \"fCZ\": 0.9461298002947109,\n", - " \"fCZ_std_err\": 0.008430971440763647,\n", - " \"fISWAP\": 0.9766269919766303,\n", - " \"fISWAP_std_err\": 0.0019014707924626996\n", - " },\n", - " \"44-45\": {\n", - " \"fCZ\": 0.9755393457707263,\n", - " \"fCZ_std_err\": 0.003943884052236176,\n", - " \"fISWAP\": 0.9730495165822873,\n", - " \"fISWAP_std_err\": 0.004666122346062878\n", - " },\n", - " \"44-51\": {\n", - " \"fCZ\": 0.5,\n", - " \"fCZ_std_err\": 1.0,\n", - " \"fISWAP\": 0.9579158089888303,\n", - " \"fISWAP_std_err\": 0.00695025451475838\n", - " },\n", - " \"45-46\": {\n", - " \"fCZ\": 0.9020966657305378,\n", - " \"fCZ_std_err\": 0.010842377367803063,\n", - " \"fISWAP\": 0.9839885698033055,\n", - " \"fISWAP_std_err\": 0.004785820142357263\n", - " },\n", - " \"45-52\": {\n", - " \"fCZ\": 0.9725016196879306,\n", - " \"fCZ_std_err\": 0.007004848395879452\n", - " },\n", - " \"46-47\": {\n", - " \"fISWAP\": 0.9768021087796416,\n", - " \"fISWAP_std_err\": 0.0092205674491176\n", - " },\n", - " \"46-53\": {\n", - " \"fCZ\": 0.9451739077282588,\n", - " \"fCZ_std_err\": 0.017124814756913513,\n", - " \"fISWAP\": 0.9757117047730299,\n", - " \"fISWAP_std_err\": 0.008682815084255831\n", - " },\n", - " \"47-48\": {\n", - " \"fISWAP\": 0.9550423464162892,\n", - " \"fISWAP_std_err\": 0.004984347718887333\n", - " },\n", - " \"47-54\": {\n", - " \"fISWAP\": 0.9613622679806231,\n", - " \"fISWAP_std_err\": 0.007458633706902614\n", - " },\n", - " \"48-55\": {\n", - " \"fISWAP\": 0.9627634980192908,\n", - " \"fISWAP_std_err\": 0.008282465401507198\n", - " },\n", - " \"49-56\": {\n", - " \"fISWAP\": 0.9883432051303519,\n", - " \"fISWAP_std_err\": 0.002531660644875566\n", - " },\n", - " \"5-12\": {\n", - " \"fISWAP\": 0.9893583872207398,\n", - " \"fISWAP_std_err\": 0.0014257446945732488\n", - " },\n", - " \"5-6\": {\n", - " \"fISWAP\": 0.9901198194537191,\n", - " \"fISWAP_std_err\": 0.0023940060470740735\n", - " },\n", - " \"50-51\": {\n", - " \"fCZ\": 0.9577213983869439,\n", - " \"fCZ_std_err\": 0.00860739284378715,\n", - " \"fISWAP\": 0.970702338038483,\n", - " \"fISWAP_std_err\": 0.006287196902663408\n", - " },\n", - " \"50-57\": {\n", - " \"fISWAP\": 0.9181143945211716,\n", - " \"fISWAP_std_err\": 0.010709223168729637\n", - " },\n", - " \"51-52\": {\n", - " \"fCZ\": 0.9491564067962153,\n", - " \"fCZ_std_err\": 0.010884026886345,\n", - " \"fISWAP\": 0.9746589779529199,\n", - " \"fISWAP_std_err\": 0.0061848268982777855\n", - " },\n", - " \"51-58\": {\n", - " \"fISWAP\": 0.8403915403637805,\n", - " \"fISWAP_std_err\": 0.012742536208155807\n", - " },\n", - " \"52-53\": {\n", - " \"fCZ\": 0.5,\n", - " \"fCZ_std_err\": 1.0\n", - " },\n", - " \"52-59\": {\n", - " \"fISWAP\": 0.9203207891426108,\n", - " \"fISWAP_std_err\": 0.019828596480304012\n", - " },\n", - " \"53-54\": {\n", - " \"fISWAP\": 0.9674717937208283,\n", - " \"fISWAP_std_err\": 0.0070984952256322245\n", - " },\n", - " \"54-55\": {\n", - " \"fISWAP\": 0.9241017064675299,\n", - " \"fISWAP_std_err\": 0.00579950375625575\n", - " },\n", - " \"54-61\": {\n", - " \"fISWAP\": 0.9844278693209709,\n", - " \"fISWAP_std_err\": 0.002946157403567885\n", - " },\n", - " \"55-62\": {\n", - " \"fISWAP\": 0.9518052675566455,\n", - " \"fISWAP_std_err\": 0.017777481156444015\n", - " },\n", - " \"56-57\": {\n", - " \"fISWAP\": 0.9856449237323003,\n", - " \"fISWAP_std_err\": 0.002348867430248925\n", - " },\n", - " \"56-63\": {\n", - " \"fISWAP\": 0.9360365974523757,\n", - " \"fISWAP_std_err\": 0.007315167371921507\n", - " },\n", - " \"57-58\": {\n", - " \"fISWAP\": 0.9733255282434983,\n", - " \"fISWAP_std_err\": 0.005805794216418861\n", - " },\n", - " \"57-64\": {\n", - " \"fISWAP\": 0.9700771134591953,\n", - " \"fISWAP_std_err\": 0.006807274914590517\n", - " },\n", - " \"58-59\": {\n", - " \"fISWAP\": 0.9720131861793257,\n", - " \"fISWAP_std_err\": 0.004869639197985184\n", - " },\n", - " \"58-65\": {\n", - " \"fISWAP\": 0.9520302367809772,\n", - " \"fISWAP_std_err\": 0.002479609587737865\n", - " },\n", - " \"59-60\": {\n", - " \"fISWAP\": 0.918121625533733,\n", - " \"fISWAP_std_err\": 0.0163296351605996\n", - " },\n", - " \"59-66\": {\n", - " \"fISWAP\": 0.962176761183821,\n", - " \"fISWAP_std_err\": 0.00293839714499654\n", - " },\n", - " \"6-13\": {\n", - " \"fISWAP\": 0.8350661549230961,\n", - " \"fISWAP_std_err\": 0.018642688812400166\n", - " },\n", - " \"61-62\": {\n", - " \"fISWAP\": 0.9605561884323802,\n", - " \"fISWAP_std_err\": 0.006578316080404304\n", - " },\n", - " \"61-68\": {\n", - " \"fISWAP\": 0.9669918432562913,\n", - " \"fISWAP_std_err\": 0.015121182843608215\n", - " },\n", - " \"62-69\": {\n", - " \"fISWAP\": 0.9814606775419943,\n", - " \"fISWAP_std_err\": 0.0036291564038816206\n", - " },\n", - " \"63-64\": {\n", - " \"fISWAP\": 0.9317990152425788,\n", - " \"fISWAP_std_err\": 0.0176307336668283\n", - " },\n", - " \"63-70\": {\n", - " \"fISWAP\": 0.975625564360936,\n", - " \"fISWAP_std_err\": 0.003896686974752096\n", - " },\n", - " \"64-65\": {\n", - " \"fISWAP\": 0.9679627656238718,\n", - " \"fISWAP_std_err\": 0.0063148296587278475\n", - " },\n", - " \"64-71\": {\n", - " \"fISWAP\": 0.9812035287003874,\n", - " \"fISWAP_std_err\": 0.0036838583297461288\n", - " },\n", - " \"65-66\": {\n", - " \"fISWAP\": 0.9561822123332422,\n", - " \"fISWAP_std_err\": 0.013048407432204236\n", - " },\n", - " \"65-72\": {\n", - " \"fISWAP\": 0.9560707484727107,\n", - " \"fISWAP_std_err\": 0.005119745898548705\n", - " },\n", - " \"66-67\": {\n", - " \"fISWAP\": 0.9048855427128404,\n", - " \"fISWAP_std_err\": 0.013224190178390091\n", - " },\n", - " \"67-68\": {\n", - " \"fISWAP\": 0.9735960543140385,\n", - " \"fISWAP_std_err\": 0.0022440091941664407\n", - " },\n", - " \"67-74\": {\n", - " \"fISWAP\": 0.5,\n", - " \"fISWAP_std_err\": 1.0\n", - " },\n", - " \"68-69\": {\n", - " \"fISWAP\": 0.8100065680392248,\n", - " \"fISWAP_std_err\": 0.06160381859949534\n", - " },\n", - " \"68-75\": {\n", - " \"fISWAP\": 0.9771469178058805,\n", - " \"fISWAP_std_err\": 0.0036298556761483374\n", - " },\n", - " \"69-76\": {\n", - " \"fISWAP\": 0.978963039803022,\n", - " \"fISWAP_std_err\": 0.004310528860614046\n", - " },\n", - " \"7-14\": {\n", - " \"fISWAP\": 0.9566739767031378,\n", - " \"fISWAP_std_err\": 0.012848358579714343\n", - " },\n", - " \"7-8\": {\n", - " \"fISWAP\": 0.9462017648325303,\n", - " \"fISWAP_std_err\": 0.020565841789161106\n", - " },\n", - " \"70-71\": {\n", - " \"fISWAP\": 0.9330614359890608,\n", - " \"fISWAP_std_err\": 0.012520387327788164\n", - " },\n", - " \"70-77\": {\n", - " \"fISWAP\": 0.9837859911880815,\n", - " \"fISWAP_std_err\": 0.0029161913777237193\n", - " },\n", - " \"71-72\": {\n", - " \"fISWAP\": 0.984763755465565,\n", - " \"fISWAP_std_err\": 0.002610649297196644\n", - " },\n", - " \"71-78\": {\n", - " \"fISWAP\": 0.9653037924768116,\n", - " \"fISWAP_std_err\": 0.005032380504562097\n", - " },\n", - " \"72-73\": {\n", - " \"fISWAP\": 0.9732560996989097,\n", - " \"fISWAP_std_err\": 0.002990176011335505\n", - " },\n", - " \"72-79\": {\n", - " \"fISWAP\": 0.9805028887008518,\n", - " \"fISWAP_std_err\": 0.0062179564542838486\n", - " },\n", - " \"73-74\": {\n", - " \"fISWAP\": 0.99312484820244,\n", - " \"fISWAP_std_err\": 0.0026141000472861115\n", - " },\n", - " \"73-80\": {\n", - " \"fISWAP\": 0.9860014674970105,\n", - " \"fISWAP_std_err\": 0.0021649690118058468\n", - " },\n", - " \"74-75\": {\n", - " \"fISWAP\": 0.9476395264300612,\n", - " \"fISWAP_std_err\": 0.0038919330556492614\n", - " },\n", - " \"74-81\": {\n", - " \"fISWAP\": 0.989010587659255,\n", - " \"fISWAP_std_err\": 0.003530918345271284\n", - " },\n", - " \"75-76\": {\n", - " \"fISWAP\": 0.9930268416475938,\n", - " \"fISWAP_std_err\": 0.002047839750711906\n", - " },\n", - " \"75-82\": {\n", - " \"fISWAP\": 0.975003261919278,\n", - " \"fISWAP_std_err\": 0.0033278095773716203\n", - " },\n", - " \"76-83\": {\n", - " \"fISWAP\": 0.978975407953992,\n", - " \"fISWAP_std_err\": 0.004240495156991981\n", - " },\n", - " \"77-78\": {\n", - " \"fISWAP\": 0.9466536450196962,\n", - " \"fISWAP_std_err\": 0.006045840719028088\n", - " },\n", - " \"78-79\": {\n", - " \"fISWAP\": 0.9151932765694304,\n", - " \"fISWAP_std_err\": 0.01246194931606675\n", - " },\n", - " \"79-80\": {\n", - " \"fISWAP\": 0.9608392414159426,\n", - " \"fISWAP_std_err\": 0.008322314755361252\n", - " },\n", - " \"8-15\": {\n", - " \"fISWAP\": 0.9555008835352836,\n", - " \"fISWAP_std_err\": 0.005294697346314612\n", - " },\n", - " \"8-9\": {\n", - " \"fISWAP\": 0.9853092684673772,\n", - " \"fISWAP_std_err\": 0.0029406075385905754\n", - " },\n", - " \"80-81\": {\n", - " \"fISWAP\": 0.9786280670433216,\n", - " \"fISWAP_std_err\": 0.0037847640547627997\n", - " },\n", - " \"81-82\": {\n", - " \"fISWAP\": 0.9847373102108626,\n", - " \"fISWAP_std_err\": 0.005616898527090091\n", - " },\n", - " \"82-83\": {\n", - " \"fISWAP\": 0.9476158528124492,\n", - " \"fISWAP_std_err\": 0.011421722288560053\n", - " },\n", - " \"9-10\": {\n", - " \"fISWAP\": 0.9778464831306,\n", - " \"fISWAP_std_err\": 0.0016229102326154002\n", - " },\n", - " \"9-16\": {\n", - " \"fISWAP\": 0.9241311731108792,\n", - " \"fISWAP_std_err\": 0.007007555394104928\n", - " }\n", - " }\n", - "}\n" - ] - } - ], - "source": [ - "# the IonQ device\n", - "device = AwsDevice(Devices.IonQ.Aria1)\n", - "\n", - "# IQM\n", - "device = AwsDevice(Devices.IQM.Garnet)\n", - "\n", - "# the Rigetti device\n", - "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "\n", - "execution_windows = device.properties.service.executionWindows\n", - "connectivity_graph = device.properties.paradigm.connectivity\n", - "calibration = device.properties.provider.specs\n", - "\n", - "print(f'The availability windows for {device.name}:\\n{execution_windows}\\n')\n", - "print(f'The connectivity graph of the qubits for this device:\\n {connectivity_graph}\\n')\n", - "print('Calibration data:\\n', json.dumps(calibration,sort_keys=True,indent=2))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each device has more properties to explore. To learn more, view the [Amazon Braket schemas documentation](https://amazon-braket-schemas-python.readthedocs.io/en/latest/_apidoc/braket.device_schema.html)." - ] - } - ], - "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.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting Devices and Checking Device Properties\n", + "\n", + "This tutorial demonstrates how to use the `get_devices()` method to search and instantiate devices available on Amazon Braket. It also shows how to obtain access to properties for simulator and QPU devices." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:22.928626Z", + "start_time": "2023-08-29T21:51:20.846031Z" + } + }, + "outputs": [], + "source": [ + "# general imports\n", + "import json\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.devices import Devices, LocalSimulator" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using get_devices\n", + "You can get a device, including the on-demand simulators and the QPUs, by calling the `get_devices()` method. Search for devices with one or more of the following filtering criteria:\n", + "* device arn \n", + "* name \n", + "* type \n", + "* status \n", + "* provider_name. \n", + "\n", + "The following cells give examples for each of the cases." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting the device by type" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:23.791309Z", + "start_time": "2023-08-29T21:51:22.939296Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': SV1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/sv1),\n", + " Device('name': TN1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/tn1),\n", + " Device('name': dm1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/dm1)]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# to get the on-demand simulators\n", + "AwsDevice.get_devices(types=[\"SIMULATOR\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2),\n", + " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", + " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", + " Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2),\n", + " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", + " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet)]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# to get the list of QPUs\n", + "AwsDevice.get_devices(types=[\"QPU\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting the device by ARN\n", + "For every type of device available in Amazon Braket, you can find the associated ARN in the Amazon Braket [Developer Guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html). You also can view the device ARN on the `Devices` section in the Amazon Braket console." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:40.189738Z", + "start_time": "2023-08-29T21:51:38.108942Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1)]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# for example, the following ARN refers to the IonQ device.\n", + "AwsDevice.get_devices(arns=[\"arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting the device by name" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:44.199001Z", + "start_time": "2023-08-29T21:51:40.203505Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2)]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# for example, the following name refers to a Rigetti Ankaa system.\n", + "AwsDevice.get_devices(names=[\"Ankaa-2\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting the device by status" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:49.133297Z", + "start_time": "2023-08-29T21:51:44.215934Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2),\n", + " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", + " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", + " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", + " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet),\n", + " Device('name': SV1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/sv1),\n", + " Device('name': TN1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/tn1),\n", + " Device('name': dm1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/dm1)]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# retrieve all devices that are currently online\n", + "AwsDevice.get_devices(statuses=[\"ONLINE\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:52.891651Z", + "start_time": "2023-08-29T21:51:49.147757Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2)]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# retrieve all devices that are currently offline\n", + "AwsDevice.get_devices(statuses=[\"OFFLINE\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting the device by provider_name" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:51:56.454044Z", + "start_time": "2023-08-29T21:51:52.891938Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", + " Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2),\n", + " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1)]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# for example, the following ARN retrieves the IonQ device.\n", + "AwsDevice.get_devices(provider_names=[\"IonQ\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Retrieve devices in order" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:52:10.758716Z", + "start_time": "2023-08-29T21:51:56.382501Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': TN1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/tn1),\n", + " Device('name': SV1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/sv1),\n", + " Device('name': dm1, 'arn': arn:aws:braket:::device/quantum-simulator/amazon/dm1),\n", + " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet),\n", + " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", + " Device('name': Aria 2, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-2),\n", + " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", + " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", + " Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2)]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# retrieve the list of devices, ordered by provider name\n", + "AwsDevice.get_devices(order_by=\"provider_name\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting the device with multiple criteria" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:52:15.233392Z", + "start_time": "2023-08-29T21:52:10.769127Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[Device('name': Ankaa-2, 'arn': arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2),\n", + " Device('name': Aquila, 'arn': arn:aws:braket:us-east-1::device/qpu/quera/Aquila),\n", + " Device('name': Aria 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1),\n", + " Device('name': Forte 1, 'arn': arn:aws:braket:us-east-1::device/qpu/ionq/Forte-1),\n", + " Device('name': Garnet, 'arn': arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet)]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# multiple criteria can be applied\n", + "AwsDevice.get_devices(types=[\"QPU\"], statuses=[\"ONLINE\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting a device directly\n", + "You can specify a device directly, with the device ARN. These ARNs can be specified from each device's entry in the `Devices` enum:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:52:17.486681Z", + "start_time": "2023-08-29T21:52:15.244209Z" + } + }, + "outputs": [], + "source": [ + "# specify a device directly by device ARN\n", + "# Rigetti\n", + "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "# IonQ\n", + "device = AwsDevice(Devices.IonQ.Aria1)\n", + "# IQM\n", + "device = AwsDevice(Devices.IQM.Garnet)\n", + "# the on-demand simulator SV1\n", + "device = AwsDevice(Devices.Amazon.SV1)\n", + "# the on-demand simulator TN1\n", + "device = AwsDevice(Devices.Amazon.TN1)\n", + "# the local simulator\n", + "device = LocalSimulator()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Properties of devices\n", + "\n", + "You can check properties of a device with the `device.properties` call. The following examples show some useful properties of each device." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:52:17.759631Z", + "start_time": "2023-08-29T21:52:17.502344Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The supported operations of SV1 are ['ccnot', 'cnot', 'cphaseshift', 'cphaseshift00', 'cphaseshift01', 'cphaseshift10', 'cswap', 'cy', 'cz', 'ecr', 'h', 'i', 'iswap', 'pswap', 'phaseshift', 'rx', 'ry', 'rz', 's', 'si', 'swap', 't', 'ti', 'unitary', 'v', 'vi', 'x', 'xx', 'xy', 'y', 'yy', 'z', 'zz']\n", + "\n", + "The supported result types are [ResultType(name='Sample', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=1, maxShots=100000), ResultType(name='Expectation', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Variance', observables=['x', 'y', 'z', 'h', 'i', 'hermitian'], minShots=0, maxShots=100000), ResultType(name='Probability', observables=None, minShots=1, maxShots=100000), ResultType(name='Amplitude', observables=None, minShots=0, maxShots=0)]\n", + "\n", + "The maximum number of qubits supported by this device is 34\n", + "The shots range of this device is (0, 100000)\n", + "The price of running quantum tasks on this device: price=0.075 unit='minute'\n" + ] + } + ], + "source": [ + "# the on-demand simulator SV1\n", + "device = AwsDevice(Devices.Amazon.SV1)\n", + "\n", + "support_gates = device.properties.action[\"braket.ir.jaqcd.program\"].supportedOperations\n", + "support_result_types = device.properties.action[\"braket.ir.jaqcd.program\"].supportedResultTypes\n", + "qubit_count = device.properties.paradigm.qubitCount\n", + "shots_range = device.properties.service.shotsRange\n", + "device_cost = device.properties.service.deviceCost\n", + "\n", + "print(f\"The supported operations of {device.name} are {support_gates}\\n\")\n", + "print(f\"The supported result types are {support_result_types}\\n\")\n", + "print(\"The maximum number of qubits supported by this device is\", qubit_count)\n", + "print(\"The shots range of this device is\", shots_range)\n", + "print(\"The price of running quantum tasks on this device:\", device_cost)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the IonQ and Rigetti devices, you can get information about the properties shown previously. You also can get information about the availability windows and the device calibration data." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2023-08-29T21:52:19.588547Z", + "start_time": "2023-08-29T21:52:17.773910Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The availability windows for Ankaa-2:\n", + "[DeviceExecutionWindow(executionDay=, windowStartHour=datetime.time(0, 0), windowEndHour=datetime.time(23, 59))]\n", + "\n", + "The connectivity graph of the qubits for this device:\n", + " fullyConnected=False connectivityGraph={'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n", + "\n", + "Calibration data:\n", + " {\n", + " \"1Q\": {\n", + " \"0\": {\n", + " \"T1\": 9.188738589920766e-06,\n", + " \"T2\": 1.5115358086466058e-05,\n", + " \"f1QRB\": 0.9989751997430271,\n", + " \"f1QRB_std_err\": 2.0679831486331732e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9977906923503519,\n", + " \"f1Q_simultaneous_RB_std_err\": 5.022804153387717e-05,\n", + " \"fRO\": 0.9279999999999999\n", + " },\n", + " \"1\": {\n", + " \"T1\": 1.1424822873905215e-05,\n", + " \"T2\": 7.81925508978389e-06,\n", + " \"f1QRB\": 0.9986392103526047,\n", + " \"f1QRB_std_err\": 2.5837382143438492e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9953277301386305,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00042743732391299096,\n", + " \"fRO\": 0.945\n", + " },\n", + " \"10\": {\n", + " \"T1\": 1.4397388097206513e-05,\n", + " \"T2\": 1.339262710713176e-05,\n", + " \"f1QRB\": 0.9983666919759847,\n", + " \"f1QRB_std_err\": 0.0002540204792082052,\n", + " \"f1Q_simultaneous_RB\": 0.9949091215921125,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0008697771710166471,\n", + " \"fRO\": 0.921\n", + " },\n", + " \"11\": {\n", + " \"T1\": 1.3586183291642084e-05,\n", + " \"T2\": 8.375930706648994e-06,\n", + " \"f1QRB\": 0.9987291309192002,\n", + " \"f1QRB_std_err\": 3.472614079514786e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9729235723436281,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.002137921614257448,\n", + " \"fRO\": 0.8560000000000001\n", + " },\n", + " \"12\": {\n", + " \"T1\": 1.4839379784194732e-05,\n", + " \"T2\": 1.818202231054693e-05,\n", + " \"f1QRB\": 0.998776996620199,\n", + " \"f1QRB_std_err\": 4.4974028122863406e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9979066727008618,\n", + " \"f1Q_simultaneous_RB_std_err\": 5.178760285397647e-05,\n", + " \"fRO\": 0.975\n", + " },\n", + " \"13\": {\n", + " \"T1\": 1.5012868688046168e-05,\n", + " \"T2\": 6.238808590084043e-06,\n", + " \"f1QRB\": 0.997924906562737,\n", + " \"f1QRB_std_err\": 9.068247000218935e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9960819770811921,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00020470342371224092,\n", + " \"fRO\": 0.9319999999999999\n", + " },\n", + " \"14\": {\n", + " \"T1\": 9.241177624502927e-06,\n", + " \"T2\": 1.2479145836656001e-05,\n", + " \"f1QRB\": 0.9989037419145974,\n", + " \"f1QRB_std_err\": 7.483443152934302e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9899718004895154,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0004595459103652275,\n", + " \"fRO\": 0.9410000000000001\n", + " },\n", + " \"15\": {\n", + " \"T1\": 1.3607903689853045e-05,\n", + " \"T2\": 1.2713607419342696e-05,\n", + " \"f1QRB\": 0.9983943409536015,\n", + " \"f1QRB_std_err\": 4.027027495615709e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9929483241808174,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00023770765814441926,\n", + " \"fRO\": 0.945\n", + " },\n", + " \"16\": {\n", + " \"T1\": 1.88513673725692e-05,\n", + " \"T2\": 4.7270850455358685e-06,\n", + " \"f1QRB\": 0.9987853652052536,\n", + " \"f1QRB_std_err\": 3.375389696164912e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9833505453505913,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0009000282675945473,\n", + " \"fRO\": 0.845\n", + " },\n", + " \"17\": {\n", + " \"T1\": 6.727376139504448e-06,\n", + " \"T2\": 1.3290167565629393e-05,\n", + " \"f1QRB\": 0.9988148862501292,\n", + " \"f1QRB_std_err\": 4.965553483148904e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9971513895552646,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00011975972016416049,\n", + " \"fRO\": 0.871\n", + " },\n", + " \"18\": {\n", + " \"T1\": 1.3370961985133656e-05,\n", + " \"T2\": 1.4781911797622444e-05,\n", + " \"f1QRB\": 0.9988395481906874,\n", + " \"f1QRB_std_err\": 3.334202920860159e-05,\n", + " \"f1Q_simultaneous_RB\": 0.991212188518014,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0005735243624384439,\n", + " \"fRO\": 0.9450000000000001\n", + " },\n", + " \"19\": {\n", + " \"T1\": 1.3694445091389104e-05,\n", + " \"T2\": 1.8948746412036046e-05,\n", + " \"f1QRB\": 0.9989032737033892,\n", + " \"f1QRB_std_err\": 2.1809754472271395e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9377408142450181,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.022945728139192902,\n", + " \"fRO\": 0.86\n", + " },\n", + " \"2\": {\n", + " \"T1\": 1.2858591189370053e-05,\n", + " \"T2\": 1.6878980942888143e-05,\n", + " \"f1QRB\": 0.9984345619163735,\n", + " \"f1QRB_std_err\": 9.08541980198589e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9894961138887621,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0010389843019420724,\n", + " \"fRO\": 0.9079999999999999\n", + " },\n", + " \"20\": {\n", + " \"T1\": 1.4033755270253051e-05,\n", + " \"T2\": 2.417434951047098e-05,\n", + " \"f1QRB\": 0.9984097828044537,\n", + " \"f1QRB_std_err\": 0.0001003650197355637,\n", + " \"f1Q_simultaneous_RB\": 0.9972607664140928,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0002625968643302963,\n", + " \"fRO\": 0.956\n", + " },\n", + " \"21\": {\n", + " \"T1\": 1.2585205427234064e-05,\n", + " \"T2\": 2.092706172954416e-05,\n", + " \"f1QRB\": 0.9987920931253695,\n", + " \"f1QRB_std_err\": 2.75729899097585e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9972438852563055,\n", + " \"f1Q_simultaneous_RB_std_err\": 4.7833914374202874e-05,\n", + " \"fRO\": 0.964\n", + " },\n", + " \"22\": {\n", + " \"T1\": 1.3156398816510328e-05,\n", + " \"T2\": 9.055428316830254e-06,\n", + " \"f1QRB\": 0.9987088311152464,\n", + " \"f1QRB_std_err\": 2.9284210923276044e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9882440316368954,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00217791143691248,\n", + " \"fRO\": 0.926\n", + " },\n", + " \"23\": {\n", + " \"T1\": 1.2842440379946409e-05,\n", + " \"T2\": 8.215052109680317e-06,\n", + " \"f1QRB\": 0.9974901751854006,\n", + " \"f1QRB_std_err\": 0.0001631397379850662,\n", + " \"f1Q_simultaneous_RB\": 0.9865011235636009,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0010189758801580672,\n", + " \"fRO\": 0.956\n", + " },\n", + " \"24\": {\n", + " \"T1\": 1.9346009082358398e-05,\n", + " \"T2\": 1.1937386114398276e-05,\n", + " \"f1QRB\": 0.9983253042496835,\n", + " \"f1QRB_std_err\": 8.067632036104494e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9950712793653935,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0002141642699176358,\n", + " \"fRO\": 0.979\n", + " },\n", + " \"25\": {\n", + " \"T1\": 1.1785048788788791e-05,\n", + " \"T2\": 1.4754448154974761e-05,\n", + " \"f1QRB\": 0.9979269962576733,\n", + " \"f1QRB_std_err\": 6.060664140314965e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9940890082252032,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0007016219504682814,\n", + " \"fRO\": 0.966\n", + " },\n", + " \"26\": {\n", + " \"T1\": 1.9757994068998704e-05,\n", + " \"T2\": 1.1786900530053712e-05,\n", + " \"f1QRB\": 0.9988929815534089,\n", + " \"f1QRB_std_err\": 2.8473648925082652e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9892190315759715,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0018571214358147484,\n", + " \"fRO\": 0.97\n", + " },\n", + " \"27\": {\n", + " \"T1\": 1.0772657302764382e-05,\n", + " \"T2\": 9.225720435722181e-06,\n", + " \"f1QRB\": 0.9982554695288404,\n", + " \"f1QRB_std_err\": 4.91454475921194e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9959353976666019,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00016001458516624184,\n", + " \"fRO\": 0.9139999999999999\n", + " },\n", + " \"28\": {\n", + " \"T1\": 9.981191636291515e-06,\n", + " \"T2\": 5.688781747165514e-06,\n", + " \"f1QRB\": 0.9983841943846401,\n", + " \"f1QRB_std_err\": 3.876665371947724e-05,\n", + " \"f1Q_simultaneous_RB\": 0.995992435403062,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00028985280637909165,\n", + " \"fRO\": 0.9410000000000001\n", + " },\n", + " \"29\": {\n", + " \"T1\": 1.1204638867006936e-05,\n", + " \"T2\": 1.652115287314364e-05,\n", + " \"f1QRB\": 0.9988150922713561,\n", + " \"f1QRB_std_err\": 8.275662897495279e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9952130715828645,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00034718794705519267,\n", + " \"fRO\": 0.925\n", + " },\n", + " \"3\": {\n", + " \"T1\": 1.8719464515731677e-05,\n", + " \"T2\": 1.4586748354157626e-05,\n", + " \"f1QRB\": 0.9989002998216094,\n", + " \"f1QRB_std_err\": 4.057304777251857e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9971535609092096,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0002838481061337756,\n", + " \"fRO\": 0.9239999999999999\n", + " },\n", + " \"30\": {\n", + " \"T1\": 1.244220399426232e-05,\n", + " \"T2\": 6.309696990610663e-06,\n", + " \"f1QRB\": 0.9984319024200233,\n", + " \"f1QRB_std_err\": 2.951110700225705e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9919021348796022,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0006326939371417978,\n", + " \"fRO\": 0.971\n", + " },\n", + " \"31\": {\n", + " \"T1\": 1.3062804950546854e-05,\n", + " \"T2\": 1.400102486517304e-05,\n", + " \"f1QRB\": 0.998674284285232,\n", + " \"f1QRB_std_err\": 4.043660607731187e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9916620995172601,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0002275290208907156,\n", + " \"fRO\": 0.948\n", + " },\n", + " \"32\": {\n", + " \"T1\": 1.4563700515623286e-05,\n", + " \"T2\": 1.3020747686044575e-05,\n", + " \"f1QRB\": 0.9987025319481753,\n", + " \"f1QRB_std_err\": 4.946986179999276e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9964784937971644,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00014781010102640516,\n", + " \"fRO\": 0.959\n", + " },\n", + " \"33\": {\n", + " \"T1\": 9.642732018105618e-06,\n", + " \"T2\": 1.3634615127933523e-05,\n", + " \"f1QRB\": 0.9980203558684193,\n", + " \"f1QRB_std_err\": 2.9295348076164842e-05,\n", + " \"f1Q_simultaneous_RB\": 0.983196638552863,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.002055539485119557,\n", + " \"fRO\": 0.918\n", + " },\n", + " \"34\": {\n", + " \"T1\": 1.713988970837948e-05,\n", + " \"T2\": 2.198751603734416e-05,\n", + " \"f1QRB\": 0.9990015818488835,\n", + " \"f1QRB_std_err\": 3.0424905769125453e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9813599244580338,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.004669744757842596,\n", + " \"fRO\": 0.968\n", + " },\n", + " \"35\": {\n", + " \"T1\": 1.4643912131398986e-05,\n", + " \"T2\": 3.1995577640178207e-06,\n", + " \"f1QRB\": 0.9981762911688464,\n", + " \"f1QRB_std_err\": 6.418526794908951e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9900369543687392,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0005557840471862918,\n", + " \"fRO\": 0.94\n", + " },\n", + " \"36\": {\n", + " \"T1\": 1.1051624768642374e-05,\n", + " \"T2\": 1.400670235227901e-05,\n", + " \"f1QRB\": 0.9983832731371838,\n", + " \"f1QRB_std_err\": 4.427599186346774e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9923702291289735,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.000734496046659809,\n", + " \"fRO\": 0.925\n", + " },\n", + " \"37\": {\n", + " \"T1\": 9.952535549320594e-06,\n", + " \"T2\": 9.089917827707173e-06,\n", + " \"f1QRB\": 0.9982104621121981,\n", + " \"f1QRB_std_err\": 5.9621009368908024e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9928609905289468,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0002770065858464925,\n", + " \"fRO\": 0.97\n", + " },\n", + " \"38\": {\n", + " \"T1\": 1.4542547472158691e-05,\n", + " \"T2\": 4.9119555657954954e-06,\n", + " \"f1QRB\": 0.9983391239777049,\n", + " \"f1QRB_std_err\": 5.5489399743889144e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9927274464426054,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00034490346748517424,\n", + " \"fRO\": 0.94\n", + " },\n", + " \"39\": {\n", + " \"T1\": 1.5813082724142702e-06,\n", + " \"f1QRB\": 0.9837979672096584,\n", + " \"f1QRB_std_err\": 0.0015886479371489913,\n", + " \"f1Q_simultaneous_RB\": 0.9800825196376993,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0019705352672016725,\n", + " \"fRO\": 0.948\n", + " },\n", + " \"4\": {\n", + " \"T1\": 1.221600720686062e-05,\n", + " \"T2\": 5.032176434386599e-06,\n", + " \"f1QRB\": 0.9981697192213356,\n", + " \"f1QRB_std_err\": 5.148091906526168e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9955769056038452,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0002443674943745968,\n", + " \"fRO\": 0.85\n", + " },\n", + " \"40\": {\n", + " \"T1\": 1.3836774470224874e-05,\n", + " \"T2\": 8.820018932957046e-06,\n", + " \"f1QRB\": 0.9985359309310786,\n", + " \"f1QRB_std_err\": 0.00010011566667630272,\n", + " \"f1Q_simultaneous_RB\": 0.991993880228863,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0011854776333122688,\n", + " \"fRO\": 0.868\n", + " },\n", + " \"41\": {\n", + " \"T1\": 1.2013952104481512e-05,\n", + " \"T2\": 1.9147440617148604e-05,\n", + " \"f1QRB\": 0.9988626781522412,\n", + " \"f1QRB_std_err\": 3.519955021416773e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9976416856190857,\n", + " \"f1Q_simultaneous_RB_std_err\": 7.139971507238868e-05,\n", + " \"fRO\": 0.98\n", + " },\n", + " \"42\": {\n", + " \"T1\": 1.1897315657421982e-05,\n", + " \"T2\": 6.433810612334841e-06,\n", + " \"f1QRB\": 0.9987401398855629,\n", + " \"f1QRB_std_err\": 2.4842910954783737e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9886404187567864,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.000865545671861028,\n", + " \"fRO\": 0.9199999999999999\n", + " },\n", + " \"43\": {\n", + " \"T1\": 1.175387778291488e-05,\n", + " \"T2\": 1.802576931646561e-05,\n", + " \"f1QRB\": 0.998980656920372,\n", + " \"f1QRB_std_err\": 3.047618557903109e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9966245346548614,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00012825235793464645,\n", + " \"fRO\": 0.897\n", + " },\n", + " \"44\": {\n", + " \"T1\": 1.1317533527705256e-05,\n", + " \"T2\": 7.025124023453061e-06,\n", + " \"f1QRB\": 0.9984936994107011,\n", + " \"f1QRB_std_err\": 1.9566171677975698e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9895156725495968,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0013520876714959414,\n", + " \"fRO\": 0.9430000000000001\n", + " },\n", + " \"45\": {\n", + " \"T1\": 1.3916136806546354e-05,\n", + " \"T2\": 8.54200445611926e-06,\n", + " \"f1QRB\": 0.9981938832438657,\n", + " \"f1QRB_std_err\": 7.720752371573168e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9951756210242256,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0001656578200493323,\n", + " \"fRO\": 0.883\n", + " },\n", + " \"46\": {\n", + " \"T1\": 1.6800993490267442e-05,\n", + " \"T2\": 1.390596693008661e-05,\n", + " \"f1QRB\": 0.9989904172217673,\n", + " \"f1QRB_std_err\": 0.00020792543430694119,\n", + " \"f1Q_simultaneous_RB\": 0.9740486054627526,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.003949225214890666,\n", + " \"fRO\": 0.935\n", + " },\n", + " \"47\": {\n", + " \"T1\": 2.308141076017859e-05,\n", + " \"T2\": 1.2889928165515491e-05,\n", + " \"f1QRB\": 0.9989701426764845,\n", + " \"f1QRB_std_err\": 3.549452729438895e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9936809932934392,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0005194840701065176,\n", + " \"fRO\": 0.966\n", + " },\n", + " \"48\": {\n", + " \"T1\": 2.4482424062851024e-05,\n", + " \"T2\": 1.968317056642545e-05,\n", + " \"f1QRB\": 0.998901164295319,\n", + " \"f1QRB_std_err\": 1.8909296638901778e-05,\n", + " \"f1Q_simultaneous_RB\": 0.997621217085471,\n", + " \"f1Q_simultaneous_RB_std_err\": 7.677949592921175e-05,\n", + " \"fRO\": 0.968\n", + " },\n", + " \"49\": {\n", + " \"T1\": 1.0015289971656016e-05,\n", + " \"T2\": 1.7014007307228258e-05,\n", + " \"f1QRB\": 0.9984258277322864,\n", + " \"f1QRB_std_err\": 5.47736816118378e-05,\n", + " \"f1Q_simultaneous_RB\": 0.995728017290028,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00015382936372201333,\n", + " \"fRO\": 0.908\n", + " },\n", + " \"5\": {\n", + " \"T1\": 1.3004498440941119e-05,\n", + " \"T2\": 1.6383805633386163e-05,\n", + " \"f1QRB\": 0.9986470862124049,\n", + " \"f1QRB_std_err\": 3.652268864366153e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9929592980797504,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00040364203755640396,\n", + " \"fRO\": 0.973\n", + " },\n", + " \"50\": {\n", + " \"T1\": 1.3464075894863434e-05,\n", + " \"T2\": 5.574754214725209e-06,\n", + " \"f1QRB\": 0.998431790229616,\n", + " \"f1QRB_std_err\": 6.748661568443685e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9959289209104987,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00014670291611745554,\n", + " \"fRO\": 0.9410000000000001\n", + " },\n", + " \"51\": {\n", + " \"T1\": 6.707631008093091e-06,\n", + " \"T2\": 1.558251977239244e-05,\n", + " \"f1QRB\": 0.9988574376159899,\n", + " \"f1QRB_std_err\": 2.2201834762021872e-05,\n", + " \"f1Q_simultaneous_RB\": 0.996977835871332,\n", + " \"f1Q_simultaneous_RB_std_err\": 5.7777036449914484e-05,\n", + " \"fRO\": 0.974\n", + " },\n", + " \"52\": {\n", + " \"T1\": 1.0876444082164132e-05,\n", + " \"T2\": 8.302581019140548e-06,\n", + " \"f1QRB\": 0.99839829160568,\n", + " \"f1QRB_std_err\": 3.717861285133706e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9933032810947588,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.000529988652814212,\n", + " \"fRO\": 0.959\n", + " },\n", + " \"53\": {\n", + " \"T1\": 1.3108836298338454e-05,\n", + " \"T2\": 1.0337667528829016e-05,\n", + " \"f1QRB\": 0.9984238159933861,\n", + " \"f1QRB_std_err\": 5.2899593808349486e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9954968598641998,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0003350853484652073,\n", + " \"fRO\": 0.9179999999999999\n", + " },\n", + " \"54\": {\n", + " \"T1\": 1.2661827615430663e-05,\n", + " \"T2\": 1.4628180000985567e-05,\n", + " \"f1QRB\": 0.9984776311382394,\n", + " \"f1QRB_std_err\": 4.138291986479403e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9897788402240421,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0015090359441196236,\n", + " \"fRO\": 0.944\n", + " },\n", + " \"55\": {\n", + " \"T1\": 6.350408716879262e-06,\n", + " \"T2\": 5.401443542130627e-06,\n", + " \"f1QRB\": 0.9976392604241605,\n", + " \"f1QRB_std_err\": 4.848970175188756e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9953757916042162,\n", + " \"f1Q_simultaneous_RB_std_err\": 4.183999712958921e-05,\n", + " \"fRO\": 0.98\n", + " },\n", + " \"56\": {\n", + " \"T1\": 2.067563472320421e-05,\n", + " \"T2\": 1.0673230508596336e-05,\n", + " \"f1QRB\": 0.9971488473112687,\n", + " \"f1QRB_std_err\": 0.00015874611974747805,\n", + " \"f1Q_simultaneous_RB\": 0.9936475546766723,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00019979052355938962,\n", + " \"fRO\": 0.9339999999999999\n", + " },\n", + " \"57\": {\n", + " \"T1\": 1.3158675098459701e-05,\n", + " \"T2\": 1.737248082358324e-05,\n", + " \"f1QRB\": 0.9980657064974754,\n", + " \"f1QRB_std_err\": 4.2934019506785746e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9816962799151328,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0014092574130662233,\n", + " \"fRO\": 0.9099999999999999\n", + " },\n", + " \"58\": {\n", + " \"T1\": 2.877245453838103e-05,\n", + " \"T2\": 1.7015583307912096e-05,\n", + " \"f1QRB\": 0.9986684576929438,\n", + " \"f1QRB_std_err\": 3.1730303092790445e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9975652149478694,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00032303779596305114,\n", + " \"fRO\": 0.946\n", + " },\n", + " \"59\": {\n", + " \"T1\": 1.160848612530693e-05,\n", + " \"T2\": 5.767198803832716e-06,\n", + " \"f1QRB\": 0.998377983141542,\n", + " \"f1QRB_std_err\": 4.5643609775957636e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9676348487178844,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.004328527980352748,\n", + " \"fRO\": 0.873\n", + " },\n", + " \"6\": {\n", + " \"T1\": 1.8239370061508387e-05,\n", + " \"T2\": 5.5417359798717045e-06,\n", + " \"f1QRB\": 0.9979075823351948,\n", + " \"f1QRB_std_err\": 0.00015227406343373901,\n", + " \"f1Q_simultaneous_RB\": 0.9974405105945053,\n", + " \"f1Q_simultaneous_RB_std_err\": 6.156481629598492e-05,\n", + " \"fRO\": 0.963\n", + " },\n", + " \"60\": {\n", + " \"T1\": 8.927064763984261e-06,\n", + " \"T2\": 9.50878568524798e-06,\n", + " \"f1QRB\": 0.9979692265193538,\n", + " \"f1QRB_std_err\": 7.168583097486353e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9851982972890478,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0008258052575669145,\n", + " \"fRO\": 0.969\n", + " },\n", + " \"61\": {\n", + " \"T1\": 1.2053050762532225e-05,\n", + " \"T2\": 1.0969753526041124e-05,\n", + " \"f1QRB\": 0.9984267839080629,\n", + " \"f1QRB_std_err\": 4.9647881711067385e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9755784741860619,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.005164330252092108,\n", + " \"fRO\": 0.881\n", + " },\n", + " \"62\": {\n", + " \"T1\": 1.7808351268249727e-05,\n", + " \"T2\": 2.0935454437796016e-05,\n", + " \"f1QRB\": 0.9988293622267578,\n", + " \"f1QRB_std_err\": 3.1724238532503364e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9952212272657633,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0001335378001105945,\n", + " \"fRO\": 0.944\n", + " },\n", + " \"63\": {\n", + " \"T1\": 1.9533544910252338e-05,\n", + " \"T2\": 8.225690384500153e-06,\n", + " \"f1QRB\": 0.9990818104537923,\n", + " \"f1QRB_std_err\": 2.591163591836797e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9976971801778179,\n", + " \"f1Q_simultaneous_RB_std_err\": 6.06654368005454e-05,\n", + " \"fRO\": 0.965\n", + " },\n", + " \"64\": {\n", + " \"T1\": 5.3259203473510294e-06,\n", + " \"T2\": 8.466173528335672e-06,\n", + " \"f1QRB\": 0.9984190186400348,\n", + " \"f1QRB_std_err\": 6.448407276294968e-05,\n", + " \"f1Q_simultaneous_RB\": 0.993011458055223,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0003924719541656447,\n", + " \"fRO\": 0.967\n", + " },\n", + " \"65\": {\n", + " \"T1\": 1.6258689130380103e-05,\n", + " \"T2\": 2.13610227524408e-05,\n", + " \"f1QRB\": 0.9989444357536232,\n", + " \"f1QRB_std_err\": 3.225989961221664e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9915636857510693,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0009472909244109095,\n", + " \"fRO\": 0.957\n", + " },\n", + " \"66\": {\n", + " \"T1\": 9.392627467562096e-06,\n", + " \"T2\": 8.92037605247448e-06,\n", + " \"f1QRB\": 0.9971650906144066,\n", + " \"f1QRB_std_err\": 0.0002669885055081551,\n", + " \"f1Q_simultaneous_RB\": 0.9632084176103134,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.004999298462372134,\n", + " \"fRO\": 0.786\n", + " },\n", + " \"67\": {\n", + " \"T1\": 1.0798303446079845e-05,\n", + " \"T2\": 1.442063080948124e-05,\n", + " \"f1QRB\": 0.9973961036972676,\n", + " \"f1QRB_std_err\": 0.00015345056365693833,\n", + " \"f1Q_simultaneous_RB\": 0.9807334968408162,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.002467546876349839,\n", + " \"fRO\": 0.871\n", + " },\n", + " \"68\": {\n", + " \"T1\": 1.528570986098691e-05,\n", + " \"T2\": 1.8660128795817277e-05,\n", + " \"f1QRB\": 0.9986868558246939,\n", + " \"f1QRB_std_err\": 5.381485644969931e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9757941434467859,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.006272810344326621,\n", + " \"fRO\": 0.9470000000000001\n", + " },\n", + " \"69\": {\n", + " \"T1\": 1.1718733631190332e-05,\n", + " \"T2\": 1.2067305674627332e-05,\n", + " \"f1QRB\": 0.9983299165088875,\n", + " \"f1QRB_std_err\": 4.875324178348875e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9959091496878513,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00016641915211360384,\n", + " \"fRO\": 0.9570000000000001\n", + " },\n", + " \"7\": {\n", + " \"T1\": 1.2203293820996904e-05,\n", + " \"T2\": 1.1632142317843116e-05,\n", + " \"f1QRB\": 0.998594898155075,\n", + " \"f1QRB_std_err\": 4.437384879873306e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9920859423780137,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0001805274048861091,\n", + " \"fRO\": 0.8979999999999999\n", + " },\n", + " \"70\": {\n", + " \"T1\": 1.23265203941526e-05,\n", + " \"T2\": 1.4719675933248264e-05,\n", + " \"f1QRB\": 0.9957792734843232,\n", + " \"f1QRB_std_err\": 0.00011750342197300224,\n", + " \"f1Q_simultaneous_RB\": 0.9970195422483246,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00016257128630305394,\n", + " \"fRO\": 0.976\n", + " },\n", + " \"71\": {\n", + " \"T1\": 1.583166332685028e-05,\n", + " \"T2\": 1.0856584979564591e-05,\n", + " \"f1QRB\": 0.9988470538918773,\n", + " \"f1QRB_std_err\": 6.0616375932213985e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9944350325795311,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00022116553019116896,\n", + " \"fRO\": 0.935\n", + " },\n", + " \"72\": {\n", + " \"T1\": 1.397358025395872e-05,\n", + " \"T2\": 1.8038754185674848e-05,\n", + " \"f1QRB\": 0.998568335008464,\n", + " \"f1QRB_std_err\": 6.054024131315892e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9849382823361392,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0013193296910071872,\n", + " \"fRO\": 0.974\n", + " },\n", + " \"73\": {\n", + " \"T1\": 1.1814906860408034e-05,\n", + " \"T2\": 8.825378096259247e-06,\n", + " \"f1QRB\": 0.9986812770773348,\n", + " \"f1QRB_std_err\": 4.031007930552348e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9873569114178359,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0009465125255858361,\n", + " \"fRO\": 0.957\n", + " },\n", + " \"74\": {\n", + " \"T1\": 1.8084856207509896e-05,\n", + " \"fRO\": 0.755\n", + " },\n", + " \"75\": {\n", + " \"T1\": 1.4599833718085063e-05,\n", + " \"T2\": 1.1762851405305077e-05,\n", + " \"f1QRB\": 0.998681824839147,\n", + " \"f1QRB_std_err\": 5.203226380860018e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9966864148141727,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0001278973109537322,\n", + " \"fRO\": 0.925\n", + " },\n", + " \"76\": {\n", + " \"T1\": 1.2786019802371923e-05,\n", + " \"T2\": 1.3142506452619197e-05,\n", + " \"f1QRB\": 0.9984067210095231,\n", + " \"f1QRB_std_err\": 5.331170411991985e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9942480052610472,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0005965011211577004,\n", + " \"fRO\": 0.964\n", + " },\n", + " \"77\": {\n", + " \"T1\": 3.079908884466668e-06,\n", + " \"T2\": 2.801177738273383e-06,\n", + " \"f1QRB\": 0.9945030681325627,\n", + " \"f1QRB_std_err\": 0.0001248838776475144,\n", + " \"f1Q_simultaneous_RB\": 0.9804732182715379,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0012486362086174888,\n", + " \"fRO\": 0.87\n", + " },\n", + " \"78\": {\n", + " \"T1\": 1.1244811327974159e-05,\n", + " \"T2\": 3.875097528754643e-06,\n", + " \"f1QRB\": 0.9983398650728867,\n", + " \"f1QRB_std_err\": 7.633315759862269e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9967692098406119,\n", + " \"f1Q_simultaneous_RB_std_err\": 7.424979279055196e-05,\n", + " \"fRO\": 0.903\n", + " },\n", + " \"79\": {\n", + " \"T1\": 5.6610288866255496e-06,\n", + " \"T2\": 8.629153961885565e-06,\n", + " \"f1QRB\": 0.9974617497608826,\n", + " \"f1QRB_std_err\": 2.781955255112645e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9958201350429458,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00013111493060712456,\n", + " \"fRO\": 0.948\n", + " },\n", + " \"8\": {\n", + " \"T1\": 1.1407003611118413e-05,\n", + " \"T2\": 1.2309370432467166e-05,\n", + " \"f1QRB\": 0.9987758357419216,\n", + " \"f1QRB_std_err\": 4.789620643962214e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9884117906966723,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.000709450806904051,\n", + " \"fRO\": 0.9490000000000001\n", + " },\n", + " \"80\": {\n", + " \"T1\": 5.978238576247811e-06,\n", + " \"T2\": 7.791064949482855e-06,\n", + " \"f1QRB\": 0.9975287511006907,\n", + " \"f1QRB_std_err\": 9.601258779724653e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9957053001975825,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00011365614144994835,\n", + " \"fRO\": 0.966\n", + " },\n", + " \"81\": {\n", + " \"T1\": 3.4310599698402173e-06,\n", + " \"T2\": 4.538643667345167e-06,\n", + " \"f1QRB\": 0.9701806785928798,\n", + " \"f1QRB_std_err\": 0.003063576918154014,\n", + " \"f1Q_simultaneous_RB\": 0.9645298408956499,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0035177577054300957,\n", + " \"fRO\": 0.881\n", + " },\n", + " \"82\": {\n", + " \"T1\": 1.1019548872967793e-05,\n", + " \"T2\": 1.3065749102731945e-05,\n", + " \"f1QRB\": 0.9984547839403882,\n", + " \"f1QRB_std_err\": 3.675749841499251e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9968747556504615,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.00012065576365671228,\n", + " \"fRO\": 0.963\n", + " },\n", + " \"83\": {\n", + " \"T1\": 1.090475453998459e-05,\n", + " \"T2\": 1.5393165671024967e-05,\n", + " \"f1QRB\": 0.9985743375675988,\n", + " \"f1QRB_std_err\": 4.7535691835826344e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9941849216547207,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.0006464784829884674,\n", + " \"fRO\": 0.972\n", + " },\n", + " \"9\": {\n", + " \"T1\": 9.785771028586126e-06,\n", + " \"T2\": 1.4090887380268008e-05,\n", + " \"f1QRB\": 0.9985960431813231,\n", + " \"f1QRB_std_err\": 4.30889189756182e-05,\n", + " \"f1Q_simultaneous_RB\": 0.9847208740742583,\n", + " \"f1Q_simultaneous_RB_std_err\": 0.001365107107806661,\n", + " \"fRO\": 0.945\n", + " }\n", + " },\n", + " \"2Q\": {\n", + " \"0-1\": {\n", + " \"fISWAP\": 0.9791302135165144,\n", + " \"fISWAP_std_err\": 0.00356371284654979\n", + " },\n", + " \"0-7\": {\n", + " \"fISWAP\": 0.9735136820907221,\n", + " \"fISWAP_std_err\": 0.005528756208824819\n", + " },\n", + " \"1-2\": {\n", + " \"fISWAP\": 0.9826670815072358,\n", + " \"fISWAP_std_err\": 0.004545721578955407\n", + " },\n", + " \"1-8\": {\n", + " \"fISWAP\": 0.9871636453178825,\n", + " \"fISWAP_std_err\": 0.0015318956008649608\n", + " },\n", + " \"10-11\": {\n", + " \"fISWAP\": 0.9608092769094925,\n", + " \"fISWAP_std_err\": 0.006832379421744852\n", + " },\n", + " \"10-17\": {\n", + " \"fISWAP\": 0.9175335256563664,\n", + " \"fISWAP_std_err\": 0.014230349601250074\n", + " },\n", + " \"11-12\": {\n", + " \"fISWAP\": 0.9653965261238255,\n", + " \"fISWAP_std_err\": 0.004074194576367181\n", + " },\n", + " \"11-18\": {\n", + " \"fISWAP\": 0.9827028393277744,\n", + " \"fISWAP_std_err\": 0.00719682143391899\n", + " },\n", + " \"12-13\": {\n", + " \"fISWAP\": 0.9860621874682959,\n", + " \"fISWAP_std_err\": 0.0016004359788634186\n", + " },\n", + " \"12-19\": {\n", + " \"fISWAP\": 0.9826169461521911,\n", + " \"fISWAP_std_err\": 0.0024860949331014254\n", + " },\n", + " \"13-20\": {\n", + " \"fISWAP\": 0.8992886975557597,\n", + " \"fISWAP_std_err\": 0.009522823050077288\n", + " },\n", + " \"14-15\": {\n", + " \"fISWAP\": 0.9176834388222596,\n", + " \"fISWAP_std_err\": 0.018092341455944\n", + " },\n", + " \"14-21\": {\n", + " \"fISWAP\": 0.9694771126842667,\n", + " \"fISWAP_std_err\": 0.003332132287104312\n", + " },\n", + " \"15-22\": {\n", + " \"fISWAP\": 0.9592408936940807,\n", + " \"fISWAP_std_err\": 0.006077022692492429\n", + " },\n", + " \"16-17\": {\n", + " \"fISWAP\": 0.9812012158724508,\n", + " \"fISWAP_std_err\": 0.004048459654837136\n", + " },\n", + " \"16-23\": {\n", + " \"fISWAP\": 0.5,\n", + " \"fISWAP_std_err\": 1.0\n", + " },\n", + " \"17-18\": {\n", + " \"fISWAP\": 0.9637999630059566,\n", + " \"fISWAP_std_err\": 0.007420641423514777\n", + " },\n", + " \"17-24\": {\n", + " \"fISWAP\": 0.9615095487981369,\n", + " \"fISWAP_std_err\": 0.0038152493178914048\n", + " },\n", + " \"18-19\": {\n", + " \"fISWAP\": 0.9624441046403442,\n", + " \"fISWAP_std_err\": 0.005903445677963392\n", + " },\n", + " \"18-25\": {\n", + " \"fISWAP\": 0.9640020475890487,\n", + " \"fISWAP_std_err\": 0.005958170516256149\n", + " },\n", + " \"19-20\": {\n", + " \"fISWAP\": 0.9753775134174749,\n", + " \"fISWAP_std_err\": 0.0030206413985383934\n", + " },\n", + " \"19-26\": {\n", + " \"fISWAP\": 0.9738883062816561,\n", + " \"fISWAP_std_err\": 0.0028133311282072795\n", + " },\n", + " \"2-3\": {\n", + " \"fISWAP\": 0.9761701890350708,\n", + " \"fISWAP_std_err\": 0.003984418130874122\n", + " },\n", + " \"2-9\": {\n", + " \"fISWAP\": 0.9878078152606788,\n", + " \"fISWAP_std_err\": 0.001604514158154127\n", + " },\n", + " \"20-27\": {\n", + " \"fISWAP\": 0.972527548688719,\n", + " \"fISWAP_std_err\": 0.005177397542386951\n", + " },\n", + " \"21-22\": {\n", + " \"fISWAP\": 0.9861867762396699,\n", + " \"fISWAP_std_err\": 0.0049924774137807245\n", + " },\n", + " \"21-28\": {\n", + " \"fISWAP\": 0.9875653043190505,\n", + " \"fISWAP_std_err\": 0.0020140206155346146\n", + " },\n", + " \"22-23\": {\n", + " \"fCZ\": 0.8131204267839887,\n", + " \"fCZ_std_err\": 0.023753498043183205,\n", + " \"fISWAP\": 0.9623701423788883,\n", + " \"fISWAP_std_err\": 0.00921488479505151\n", + " },\n", + " \"22-29\": {\n", + " \"fCZ\": 0.9553762383380866,\n", + " \"fCZ_std_err\": 0.008598180865132431,\n", + " \"fISWAP\": 0.9805701902071962,\n", + " \"fISWAP_std_err\": 0.0021701820410876095\n", + " },\n", + " \"23-24\": {\n", + " \"fCZ\": 0.9451155859277102,\n", + " \"fCZ_std_err\": 0.010411710027468532,\n", + " \"fISWAP\": 0.9768005265055224,\n", + " \"fISWAP_std_err\": 0.007770529050118395\n", + " },\n", + " \"23-30\": {\n", + " \"fCZ\": 0.9243983539104479,\n", + " \"fCZ_std_err\": 0.01802145417629321,\n", + " \"fISWAP\": 0.902738673879681,\n", + " \"fISWAP_std_err\": 0.006818833985233317\n", + " },\n", + " \"24-25\": {\n", + " \"fISWAP\": 0.9628007312892574,\n", + " \"fISWAP_std_err\": 0.003733949142578766\n", + " },\n", + " \"24-31\": {\n", + " \"fCZ\": 0.9896366048500892,\n", + " \"fCZ_std_err\": 0.00416104817282723,\n", + " \"fISWAP\": 0.9848767370537788,\n", + " \"fISWAP_std_err\": 0.0019422978529865585\n", + " },\n", + " \"25-26\": {\n", + " \"fISWAP\": 0.9683010306523239,\n", + " \"fISWAP_std_err\": 0.006305001630825598\n", + " },\n", + " \"25-32\": {\n", + " \"fISWAP\": 0.972785202975738,\n", + " \"fISWAP_std_err\": 0.004114423288032952\n", + " },\n", + " \"26-33\": {\n", + " \"fISWAP\": 0.9378890801422842,\n", + " \"fISWAP_std_err\": 0.010579261945524422\n", + " },\n", + " \"27-34\": {\n", + " \"fISWAP\": 0.9716219949788273,\n", + " \"fISWAP_std_err\": 0.003575681758071341\n", + " },\n", + " \"28-29\": {\n", + " \"fISWAP\": 0.9788494799023928,\n", + " \"fISWAP_std_err\": 0.0024364897527115585\n", + " },\n", + " \"28-35\": {\n", + " \"fISWAP\": 0.9639919058547002,\n", + " \"fISWAP_std_err\": 0.005405937189237481\n", + " },\n", + " \"29-30\": {\n", + " \"fCZ\": 0.9454242154413506,\n", + " \"fCZ_std_err\": 0.016219616156322496,\n", + " \"fISWAP\": 0.9778419678547438,\n", + " \"fISWAP_std_err\": 0.0016218686403212568\n", + " },\n", + " \"29-36\": {\n", + " \"fCZ\": 0.9835938239986446,\n", + " \"fCZ_std_err\": 0.003179043982604907,\n", + " \"fISWAP\": 0.9810825021956864,\n", + " \"fISWAP_std_err\": 0.004467142809673723\n", + " },\n", + " \"3-10\": {\n", + " \"fISWAP\": 0.9226230525066166,\n", + " \"fISWAP_std_err\": 0.008862475076832018\n", + " },\n", + " \"3-4\": {\n", + " \"fISWAP\": 0.9506201610747482,\n", + " \"fISWAP_std_err\": 0.006391161335644611\n", + " },\n", + " \"30-31\": {\n", + " \"fCZ\": 0.9782743632580108,\n", + " \"fCZ_std_err\": 0.003166566866056771,\n", + " \"fISWAP\": 0.9263920544692568,\n", + " \"fISWAP_std_err\": 0.012427788613003463\n", + " },\n", + " \"30-37\": {\n", + " \"fCZ\": 0.9381541716478992,\n", + " \"fCZ_std_err\": 0.011268263014875242,\n", + " \"fISWAP\": 0.988775694984386,\n", + " \"fISWAP_std_err\": 0.002369041711260937\n", + " },\n", + " \"31-32\": {\n", + " \"fCZ\": 0.97272030660307,\n", + " \"fCZ_std_err\": 0.0024880579085394304,\n", + " \"fISWAP\": 0.9777788392342968,\n", + " \"fISWAP_std_err\": 0.0028554362838577162\n", + " },\n", + " \"31-38\": {\n", + " \"fCZ\": 0.923589367568092,\n", + " \"fCZ_std_err\": 0.021497651582702258,\n", + " \"fISWAP\": 0.972427206095531,\n", + " \"fISWAP_std_err\": 0.002652465123841745\n", + " },\n", + " \"32-33\": {\n", + " \"fCZ\": 0.95823427800913,\n", + " \"fCZ_std_err\": 0.00446983618513398,\n", + " \"fISWAP\": 0.9794392126964651,\n", + " \"fISWAP_std_err\": 0.003170561763187578\n", + " },\n", + " \"32-39\": {\n", + " \"fCZ\": 0.9676193940962202,\n", + " \"fCZ_std_err\": 0.012180955656225673,\n", + " \"fISWAP\": 0.9471116565923102,\n", + " \"fISWAP_std_err\": 0.009485438714608638\n", + " },\n", + " \"33-34\": {\n", + " \"fISWAP\": 0.9791790005234218,\n", + " \"fISWAP_std_err\": 0.00434310763839065\n", + " },\n", + " \"33-40\": {\n", + " \"fCZ\": 0.5,\n", + " \"fCZ_std_err\": 1.0,\n", + " \"fISWAP\": 0.9836773772871124,\n", + " \"fISWAP_std_err\": 0.002413077893821505\n", + " },\n", + " \"34-41\": {\n", + " \"fISWAP\": 0.981208304769087,\n", + " \"fISWAP_std_err\": 0.0035818793671928296\n", + " },\n", + " \"35-36\": {\n", + " \"fCZ\": 0.5,\n", + " \"fCZ_std_err\": 1.0,\n", + " \"fISWAP\": 0.9363437120389613,\n", + " \"fISWAP_std_err\": 0.008771122408902885\n", + " },\n", + " \"35-42\": {\n", + " \"fCZ\": 0.5,\n", + " \"fCZ_std_err\": 1.0,\n", + " \"fISWAP\": 0.963098994577651,\n", + " \"fISWAP_std_err\": 0.0065455200479871065\n", + " },\n", + " \"36-37\": {\n", + " \"fCZ\": 0.9859932126721338,\n", + " \"fCZ_std_err\": 0.002265311115309427,\n", + " \"fISWAP\": 0.9393376252029916,\n", + " \"fISWAP_std_err\": 0.01064729584032537\n", + " },\n", + " \"36-43\": {\n", + " \"fCZ\": 0.9834422568445816,\n", + " \"fCZ_std_err\": 0.002149164215421339,\n", + " \"fISWAP\": 0.9819326300244948,\n", + " \"fISWAP_std_err\": 0.0028825293231968755\n", + " },\n", + " \"37-38\": {\n", + " \"fCZ\": 0.9730964409560557,\n", + " \"fCZ_std_err\": 0.007166947898501174,\n", + " \"fISWAP\": 0.8732615841593578,\n", + " \"fISWAP_std_err\": 0.008164821791420175\n", + " },\n", + " \"37-44\": {\n", + " \"fCZ\": 0.9898899788690768,\n", + " \"fCZ_std_err\": 0.0026127128645217013,\n", + " \"fISWAP\": 0.95157000198181,\n", + " \"fISWAP_std_err\": 0.005210452797842842\n", + " },\n", + " \"38-39\": {\n", + " \"fCZ\": 0.9152105518588706,\n", + " \"fCZ_std_err\": 0.018250356740116366,\n", + " \"fISWAP\": 0.9342088023346795,\n", + " \"fISWAP_std_err\": 0.006850634509083431\n", + " },\n", + " \"38-45\": {\n", + " \"fCZ\": 0.9345038340266254,\n", + " \"fCZ_std_err\": 0.014340313680079155,\n", + " \"fISWAP\": 0.8829262365164003,\n", + " \"fISWAP_std_err\": 0.016002126804853644\n", + " },\n", + " \"39-40\": {\n", + " \"fCZ\": 0.5,\n", + " \"fCZ_std_err\": 1.0,\n", + " \"fISWAP\": 0.9067660927446799,\n", + " \"fISWAP_std_err\": 0.007506787004908315\n", + " },\n", + " \"39-46\": {\n", + " \"fCZ\": 0.9117021474358413,\n", + " \"fCZ_std_err\": 0.019598451429119576,\n", + " \"fISWAP\": 0.9380858079746697,\n", + " \"fISWAP_std_err\": 0.00302266999144198\n", + " },\n", + " \"4-11\": {\n", + " \"fISWAP\": 0.9818165214983766,\n", + " \"fISWAP_std_err\": 0.0028171535523083178\n", + " },\n", + " \"4-5\": {\n", + " \"fISWAP\": 0.9799723111363947,\n", + " \"fISWAP_std_err\": 0.0023228402056086565\n", + " },\n", + " \"40-41\": {\n", + " \"fISWAP\": 0.8810830889606438,\n", + " \"fISWAP_std_err\": 0.04657399521192064\n", + " },\n", + " \"40-47\": {\n", + " \"fISWAP\": 0.9631231044654014,\n", + " \"fISWAP_std_err\": 0.004048391808971318\n", + " },\n", + " \"41-48\": {\n", + " \"fISWAP\": 0.9790577712837368,\n", + " \"fISWAP_std_err\": 0.001782511729009955\n", + " },\n", + " \"42-43\": {\n", + " \"fCZ\": 0.9573836076319032,\n", + " \"fCZ_std_err\": 0.008312305696217399,\n", + " \"fISWAP\": 0.9856361593139336,\n", + " \"fISWAP_std_err\": 0.004423360979212322\n", + " },\n", + " \"42-49\": {\n", + " \"fISWAP\": 0.8912119775523908,\n", + " \"fISWAP_std_err\": 0.014181359136284818\n", + " },\n", + " \"43-44\": {\n", + " \"fCZ\": 0.976542427162598,\n", + " \"fCZ_std_err\": 0.0073970381416081105,\n", + " \"fISWAP\": 0.9651377004532156,\n", + " \"fISWAP_std_err\": 0.003567681556245753\n", + " },\n", + " \"43-50\": {\n", + " \"fCZ\": 0.9461298002947109,\n", + " \"fCZ_std_err\": 0.008430971440763647,\n", + " \"fISWAP\": 0.9766269919766303,\n", + " \"fISWAP_std_err\": 0.0019014707924626996\n", + " },\n", + " \"44-45\": {\n", + " \"fCZ\": 0.9755393457707263,\n", + " \"fCZ_std_err\": 0.003943884052236176,\n", + " \"fISWAP\": 0.9730495165822873,\n", + " \"fISWAP_std_err\": 0.004666122346062878\n", + " },\n", + " \"44-51\": {\n", + " \"fCZ\": 0.5,\n", + " \"fCZ_std_err\": 1.0,\n", + " \"fISWAP\": 0.9579158089888303,\n", + " \"fISWAP_std_err\": 0.00695025451475838\n", + " },\n", + " \"45-46\": {\n", + " \"fCZ\": 0.9020966657305378,\n", + " \"fCZ_std_err\": 0.010842377367803063,\n", + " \"fISWAP\": 0.9839885698033055,\n", + " \"fISWAP_std_err\": 0.004785820142357263\n", + " },\n", + " \"45-52\": {\n", + " \"fCZ\": 0.9725016196879306,\n", + " \"fCZ_std_err\": 0.007004848395879452\n", + " },\n", + " \"46-47\": {\n", + " \"fISWAP\": 0.9768021087796416,\n", + " \"fISWAP_std_err\": 0.0092205674491176\n", + " },\n", + " \"46-53\": {\n", + " \"fCZ\": 0.9451739077282588,\n", + " \"fCZ_std_err\": 0.017124814756913513,\n", + " \"fISWAP\": 0.9757117047730299,\n", + " \"fISWAP_std_err\": 0.008682815084255831\n", + " },\n", + " \"47-48\": {\n", + " \"fISWAP\": 0.9550423464162892,\n", + " \"fISWAP_std_err\": 0.004984347718887333\n", + " },\n", + " \"47-54\": {\n", + " \"fISWAP\": 0.9613622679806231,\n", + " \"fISWAP_std_err\": 0.007458633706902614\n", + " },\n", + " \"48-55\": {\n", + " \"fISWAP\": 0.9627634980192908,\n", + " \"fISWAP_std_err\": 0.008282465401507198\n", + " },\n", + " \"49-56\": {\n", + " \"fISWAP\": 0.9883432051303519,\n", + " \"fISWAP_std_err\": 0.002531660644875566\n", + " },\n", + " \"5-12\": {\n", + " \"fISWAP\": 0.9893583872207398,\n", + " \"fISWAP_std_err\": 0.0014257446945732488\n", + " },\n", + " \"5-6\": {\n", + " \"fISWAP\": 0.9901198194537191,\n", + " \"fISWAP_std_err\": 0.0023940060470740735\n", + " },\n", + " \"50-51\": {\n", + " \"fCZ\": 0.9577213983869439,\n", + " \"fCZ_std_err\": 0.00860739284378715,\n", + " \"fISWAP\": 0.970702338038483,\n", + " \"fISWAP_std_err\": 0.006287196902663408\n", + " },\n", + " \"50-57\": {\n", + " \"fISWAP\": 0.9181143945211716,\n", + " \"fISWAP_std_err\": 0.010709223168729637\n", + " },\n", + " \"51-52\": {\n", + " \"fCZ\": 0.9491564067962153,\n", + " \"fCZ_std_err\": 0.010884026886345,\n", + " \"fISWAP\": 0.9746589779529199,\n", + " \"fISWAP_std_err\": 0.0061848268982777855\n", + " },\n", + " \"51-58\": {\n", + " \"fISWAP\": 0.8403915403637805,\n", + " \"fISWAP_std_err\": 0.012742536208155807\n", + " },\n", + " \"52-53\": {\n", + " \"fCZ\": 0.5,\n", + " \"fCZ_std_err\": 1.0\n", + " },\n", + " \"52-59\": {\n", + " \"fISWAP\": 0.9203207891426108,\n", + " \"fISWAP_std_err\": 0.019828596480304012\n", + " },\n", + " \"53-54\": {\n", + " \"fISWAP\": 0.9674717937208283,\n", + " \"fISWAP_std_err\": 0.0070984952256322245\n", + " },\n", + " \"54-55\": {\n", + " \"fISWAP\": 0.9241017064675299,\n", + " \"fISWAP_std_err\": 0.00579950375625575\n", + " },\n", + " \"54-61\": {\n", + " \"fISWAP\": 0.9844278693209709,\n", + " \"fISWAP_std_err\": 0.002946157403567885\n", + " },\n", + " \"55-62\": {\n", + " \"fISWAP\": 0.9518052675566455,\n", + " \"fISWAP_std_err\": 0.017777481156444015\n", + " },\n", + " \"56-57\": {\n", + " \"fISWAP\": 0.9856449237323003,\n", + " \"fISWAP_std_err\": 0.002348867430248925\n", + " },\n", + " \"56-63\": {\n", + " \"fISWAP\": 0.9360365974523757,\n", + " \"fISWAP_std_err\": 0.007315167371921507\n", + " },\n", + " \"57-58\": {\n", + " \"fISWAP\": 0.9733255282434983,\n", + " \"fISWAP_std_err\": 0.005805794216418861\n", + " },\n", + " \"57-64\": {\n", + " \"fISWAP\": 0.9700771134591953,\n", + " \"fISWAP_std_err\": 0.006807274914590517\n", + " },\n", + " \"58-59\": {\n", + " \"fISWAP\": 0.9720131861793257,\n", + " \"fISWAP_std_err\": 0.004869639197985184\n", + " },\n", + " \"58-65\": {\n", + " \"fISWAP\": 0.9520302367809772,\n", + " \"fISWAP_std_err\": 0.002479609587737865\n", + " },\n", + " \"59-60\": {\n", + " \"fISWAP\": 0.918121625533733,\n", + " \"fISWAP_std_err\": 0.0163296351605996\n", + " },\n", + " \"59-66\": {\n", + " \"fISWAP\": 0.962176761183821,\n", + " \"fISWAP_std_err\": 0.00293839714499654\n", + " },\n", + " \"6-13\": {\n", + " \"fISWAP\": 0.8350661549230961,\n", + " \"fISWAP_std_err\": 0.018642688812400166\n", + " },\n", + " \"61-62\": {\n", + " \"fISWAP\": 0.9605561884323802,\n", + " \"fISWAP_std_err\": 0.006578316080404304\n", + " },\n", + " \"61-68\": {\n", + " \"fISWAP\": 0.9669918432562913,\n", + " \"fISWAP_std_err\": 0.015121182843608215\n", + " },\n", + " \"62-69\": {\n", + " \"fISWAP\": 0.9814606775419943,\n", + " \"fISWAP_std_err\": 0.0036291564038816206\n", + " },\n", + " \"63-64\": {\n", + " \"fISWAP\": 0.9317990152425788,\n", + " \"fISWAP_std_err\": 0.0176307336668283\n", + " },\n", + " \"63-70\": {\n", + " \"fISWAP\": 0.975625564360936,\n", + " \"fISWAP_std_err\": 0.003896686974752096\n", + " },\n", + " \"64-65\": {\n", + " \"fISWAP\": 0.9679627656238718,\n", + " \"fISWAP_std_err\": 0.0063148296587278475\n", + " },\n", + " \"64-71\": {\n", + " \"fISWAP\": 0.9812035287003874,\n", + " \"fISWAP_std_err\": 0.0036838583297461288\n", + " },\n", + " \"65-66\": {\n", + " \"fISWAP\": 0.9561822123332422,\n", + " \"fISWAP_std_err\": 0.013048407432204236\n", + " },\n", + " \"65-72\": {\n", + " \"fISWAP\": 0.9560707484727107,\n", + " \"fISWAP_std_err\": 0.005119745898548705\n", + " },\n", + " \"66-67\": {\n", + " \"fISWAP\": 0.9048855427128404,\n", + " \"fISWAP_std_err\": 0.013224190178390091\n", + " },\n", + " \"67-68\": {\n", + " \"fISWAP\": 0.9735960543140385,\n", + " \"fISWAP_std_err\": 0.0022440091941664407\n", + " },\n", + " \"67-74\": {\n", + " \"fISWAP\": 0.5,\n", + " \"fISWAP_std_err\": 1.0\n", + " },\n", + " \"68-69\": {\n", + " \"fISWAP\": 0.8100065680392248,\n", + " \"fISWAP_std_err\": 0.06160381859949534\n", + " },\n", + " \"68-75\": {\n", + " \"fISWAP\": 0.9771469178058805,\n", + " \"fISWAP_std_err\": 0.0036298556761483374\n", + " },\n", + " \"69-76\": {\n", + " \"fISWAP\": 0.978963039803022,\n", + " \"fISWAP_std_err\": 0.004310528860614046\n", + " },\n", + " \"7-14\": {\n", + " \"fISWAP\": 0.9566739767031378,\n", + " \"fISWAP_std_err\": 0.012848358579714343\n", + " },\n", + " \"7-8\": {\n", + " \"fISWAP\": 0.9462017648325303,\n", + " \"fISWAP_std_err\": 0.020565841789161106\n", + " },\n", + " \"70-71\": {\n", + " \"fISWAP\": 0.9330614359890608,\n", + " \"fISWAP_std_err\": 0.012520387327788164\n", + " },\n", + " \"70-77\": {\n", + " \"fISWAP\": 0.9837859911880815,\n", + " \"fISWAP_std_err\": 0.0029161913777237193\n", + " },\n", + " \"71-72\": {\n", + " \"fISWAP\": 0.984763755465565,\n", + " \"fISWAP_std_err\": 0.002610649297196644\n", + " },\n", + " \"71-78\": {\n", + " \"fISWAP\": 0.9653037924768116,\n", + " \"fISWAP_std_err\": 0.005032380504562097\n", + " },\n", + " \"72-73\": {\n", + " \"fISWAP\": 0.9732560996989097,\n", + " \"fISWAP_std_err\": 0.002990176011335505\n", + " },\n", + " \"72-79\": {\n", + " \"fISWAP\": 0.9805028887008518,\n", + " \"fISWAP_std_err\": 0.0062179564542838486\n", + " },\n", + " \"73-74\": {\n", + " \"fISWAP\": 0.99312484820244,\n", + " \"fISWAP_std_err\": 0.0026141000472861115\n", + " },\n", + " \"73-80\": {\n", + " \"fISWAP\": 0.9860014674970105,\n", + " \"fISWAP_std_err\": 0.0021649690118058468\n", + " },\n", + " \"74-75\": {\n", + " \"fISWAP\": 0.9476395264300612,\n", + " \"fISWAP_std_err\": 0.0038919330556492614\n", + " },\n", + " \"74-81\": {\n", + " \"fISWAP\": 0.989010587659255,\n", + " \"fISWAP_std_err\": 0.003530918345271284\n", + " },\n", + " \"75-76\": {\n", + " \"fISWAP\": 0.9930268416475938,\n", + " \"fISWAP_std_err\": 0.002047839750711906\n", + " },\n", + " \"75-82\": {\n", + " \"fISWAP\": 0.975003261919278,\n", + " \"fISWAP_std_err\": 0.0033278095773716203\n", + " },\n", + " \"76-83\": {\n", + " \"fISWAP\": 0.978975407953992,\n", + " \"fISWAP_std_err\": 0.004240495156991981\n", + " },\n", + " \"77-78\": {\n", + " \"fISWAP\": 0.9466536450196962,\n", + " \"fISWAP_std_err\": 0.006045840719028088\n", + " },\n", + " \"78-79\": {\n", + " \"fISWAP\": 0.9151932765694304,\n", + " \"fISWAP_std_err\": 0.01246194931606675\n", + " },\n", + " \"79-80\": {\n", + " \"fISWAP\": 0.9608392414159426,\n", + " \"fISWAP_std_err\": 0.008322314755361252\n", + " },\n", + " \"8-15\": {\n", + " \"fISWAP\": 0.9555008835352836,\n", + " \"fISWAP_std_err\": 0.005294697346314612\n", + " },\n", + " \"8-9\": {\n", + " \"fISWAP\": 0.9853092684673772,\n", + " \"fISWAP_std_err\": 0.0029406075385905754\n", + " },\n", + " \"80-81\": {\n", + " \"fISWAP\": 0.9786280670433216,\n", + " \"fISWAP_std_err\": 0.0037847640547627997\n", + " },\n", + " \"81-82\": {\n", + " \"fISWAP\": 0.9847373102108626,\n", + " \"fISWAP_std_err\": 0.005616898527090091\n", + " },\n", + " \"82-83\": {\n", + " \"fISWAP\": 0.9476158528124492,\n", + " \"fISWAP_std_err\": 0.011421722288560053\n", + " },\n", + " \"9-10\": {\n", + " \"fISWAP\": 0.9778464831306,\n", + " \"fISWAP_std_err\": 0.0016229102326154002\n", + " },\n", + " \"9-16\": {\n", + " \"fISWAP\": 0.9241311731108792,\n", + " \"fISWAP_std_err\": 0.007007555394104928\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# the IonQ device\n", + "device = AwsDevice(Devices.IonQ.Aria1)\n", + "\n", + "# IQM\n", + "device = AwsDevice(Devices.IQM.Garnet)\n", + "\n", + "# the Rigetti device\n", + "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "\n", + "execution_windows = device.properties.service.executionWindows\n", + "connectivity_graph = device.properties.paradigm.connectivity\n", + "calibration = device.properties.provider.specs\n", + "\n", + "print(f\"The availability windows for {device.name}:\\n{execution_windows}\\n\")\n", + "print(f\"The connectivity graph of the qubits for this device:\\n {connectivity_graph}\\n\")\n", + "print(\"Calibration data:\\n\", json.dumps(calibration, sort_keys=True, indent=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each device has more properties to explore. To learn more, view the [Amazon Braket schemas documentation](https://amazon-braket-schemas-python.readthedocs.io/en/latest/_apidoc/braket.device_schema.html)." + ] + } + ], + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/braket_features/Getting_Started_with_OpenQASM_on_Braket.ipynb b/examples/braket_features/Getting_Started_with_OpenQASM_on_Braket.ipynb index a315cba69..de0e50816 100644 --- a/examples/braket_features/Getting_Started_with_OpenQASM_on_Braket.ipynb +++ b/examples/braket_features/Getting_Started_with_OpenQASM_on_Braket.ipynb @@ -1,1769 +1,1784 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "80787a2d092c6fe2", - "metadata": {}, - "source": [ - "# Getting Started with OpenQASM on Braket" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "f30932accbfc8959", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:03:29.377972Z", - "start_time": "2023-12-04T04:03:29.350550Z" - } - }, - "outputs": [], - "source": [ - "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", - "from braket.tracking import Tracker\n", - "t = Tracker().start()" - ] - }, - { - "cell_type": "markdown", - "id": "a2b23cf2abc23663", - "metadata": {}, - "source": [ - "OpenQASM is a popular human-readable and hardware-agnostic quantum circuit description language. It is open-source and has been actively maintained by a [Technical Steering Committee](https://medium.com/qiskit/introducing-a-technical-steering-committee-for-openqasm3-f9db808108e1) formed by IBM, Amazon, Microsoft and the University of Innsbruck. Amazon Braket now supports OpenQASM 3.0 as an *Intermediate Representation* (IR) in addition to the in-house *JSON-Based AWS Quantum Circuit Description* ([JAQCD](https://github.com/amazon-braket/amazon-braket-schemas-python/tree/main/src/braket/ir/jaqcd)). In this notebook, we demonstrate how to submit OpenQASM quantum tasks to various devices on Braket and introduce some OpenQASM features available on Braket." - ] - }, - { - "cell_type": "markdown", - "id": "ee898521529c0469", - "metadata": {}, - "source": [ - "## Create and submit an OpenQASM quantum task\n", - "\n", - "Submitting a quantum task with OpenQASM is just as simple as using JAQCD. You can use the Amazon Braket Python SDK, Boto3, or the AWS CLI to submit OpenQASM 3.0 quantum tasks to an Amazon Braket device. We will go over each method in this section.\n", - "\n", - "\n", - "### A Bell state\n", - "\n", - "We will start with by preparing a [Bell state](https://en.wikipedia.org/wiki/Bell_state) in OpenQASM:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "ca2bc5f0a29e6dd6", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:03:31.815079Z", - "start_time": "2023-12-04T04:03:31.796365Z" - } - }, - "outputs": [], - "source": [ - "bell_qasm = \"\"\"\n", - "OPENQASM 3;\n", - "\n", - "qubit[2] q;\n", - "bit[2] c;\n", - "\n", - "h q[0];\n", - "cnot q[0], q[1];\n", - "\n", - "c = measure q;\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "d9b588c2b02979f6", - "metadata": {}, - "source": [ - "Compare this to the same Bell state written in JAQCD:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "a378dc21e3ede3d0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:03:32.662932Z", - "start_time": "2023-12-04T04:03:32.608503Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{\n", - " \"braketSchemaHeader\": {\n", - " \"name\": \"braket.ir.jaqcd.program\",\n", - " \"version\": \"1\"\n", - " },\n", - " \"instructions\": [\n", - " {\n", - " \"target\": 0,\n", - " \"type\": \"h\"\n", - " },\n", - " {\n", - " \"control\": 0,\n", - " \"target\": 1,\n", - " \"type\": \"cnot\"\n", - " }\n", - " ],\n", - " \"results\": null,\n", - " \"basis_rotation_instructions\": null\n", - "}\n" - ] - } - ], - "source": [ - "from braket.ir.jaqcd import CNot, H, Program\n", - "\n", - "program = Program(instructions=[H(target=0), CNot(control=0, target=1)])\n", - "print(program.json(indent=2))" - ] - }, - { - "cell_type": "markdown", - "id": "b8f68befdae02c0", - "metadata": {}, - "source": [ - "Immediately, we can see a difference: In OpenQASM, users define their own qubit registers, and thus the syntax is closer to what quantum algorithm researchers are used to; on the other hand, in JAQCD, qubits are indexed by integers and the convention is closer to that of hardware providers. Also, JAQCD has result types and basis rotation instructions embedded in the language while OpenQASM doesn't support them inherently (but later we will show how to use the `pragma` syntax to support them in OpenQASM)." - ] - }, - { - "cell_type": "markdown", - "id": "a92df8c76a81db2c", - "metadata": {}, - "source": [ - "\n", - "### Use the Python SDK to create OpenQASM 3.0 quantum tasks\n", - "\n", - "Most Braket users might want to use the Braket Python SDK to submit OpenQASM quantum tasks. To submit our Bell state program in the Python SDK, we first choose the quantum device that we want to run our program on. In this example, we will use the SV1 state-vector simulator for demonstration." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "8b433a601a62b11d", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:03:38.321971Z", - "start_time": "2023-12-04T04:03:36.978785Z" - } - }, - "outputs": [], - "source": [ - "from braket.aws import AwsDevice\n", - "from braket.devices import Devices\n", - "sv1 = AwsDevice(Devices.Amazon.SV1)" - ] - }, - { - "cell_type": "markdown", - "id": "d46340ec242cfc8b", - "metadata": {}, - "source": [ - "To submit the OpenQASM quantum task, we initialize an `OpenQASMProgram` object using the Bell state program text string `bell_qasm` we defined above and send it to the SV1 simulator." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "1e81325c5357195d", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:03:41.134199Z", - "start_time": "2023-12-04T04:03:39.866510Z" - }, - "scrolled": false - }, - "outputs": [], - "source": [ - "from braket.ir.openqasm import Program as OpenQASMProgram\n", - "\n", - "bell_program = OpenQASMProgram(source=bell_qasm)\n", - "bell_task = sv1.run(\n", - " bell_program, \n", - " shots=100, \n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "ba9729ce6ab2bf91", - "metadata": {}, - "source": [ - "### Submit OpenQASM 3.0 programs using the AWS Command Line Interface\n", - "\n", - "Alternatively, if you like the command line experience or you are not a Python user, you can also choose to use the [AWS Command Line Interface (CLI)](https://aws.amazon.com/cli/) to submit our Bell state program. Before doing that we have to make sure we have [AWS CLI installed](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). The following code saves the `bell_qasm` string to a file named `bell.qasm`:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "61362f489016dd1f", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.407834Z", - "start_time": "2023-11-21T08:32:41.403524Z" - } - }, - "outputs": [], - "source": [ - "with open(\"bell.qasm\", \"w\") as f:\n", - " f.write(bell_qasm)" - ] - }, - { - "cell_type": "markdown", - "id": "5c4be932b51fd2ac", - "metadata": {}, - "source": [ - "Then we can use the command below to submit the quantum task via AWS CLI. Remember to replace the placeholder \\\"amazon-braket-my-bucket\\\" with your own bucket name.\n", - " \n", - " aws braket create-quantum-task \\\n", - " --region \"us-west-1\" \\\n", - " --device-arn \"arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2\" \\\n", - " --shots 100 \\\n", - " --action '{\n", - " \"braketSchemaHeader\": {\n", - " \"name\": \"braket.ir.openqasm.program\", \n", - " \"version\": \"1\"\n", - " },\n", - " \"source\": $(cat bell.qasm)\n", - " }'" - ] - }, - { - "cell_type": "markdown", - "id": "68222e9240c91d58", - "metadata": { - "collapsed": false - }, - "source": [ - "## Convert OpenQASM 3.0 programs to circuits\n", - "\n", - "You can convert OpenQASM programs into Braket `Circuit` objects if you want to programmatically change your program." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "96417df481e2f5d", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.420933Z", - "start_time": "2023-11-21T08:32:41.407658Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │\n", - " ┌───┐ ┌───┐ \n", - "q0 : ─┤ H ├───●───┤ M ├─\n", - " └───┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q1 : ───────┤ X ├─┤ M ├─\n", - " └───┘ └───┘ \n", - "T : │ 0 │ 1 │ 2 │\n" - ] - } - ], - "source": [ - "from braket.circuits import Circuit\n", - "print(Circuit.from_ir(bell_qasm))" - ] - }, - { - "cell_type": "markdown", - "id": "4fec44c2bb4680df", - "metadata": {}, - "source": [ - "## Figure out what OpenQASM features are supported on each device\n", - "\n", - "Different devices on Braket support different subsets of OpenQASM features. To see what are the supported OpenQASM features on each device, we can simply check the device capability for OpenQASM actions. As an example, we can take a look at the `action` field in the device capability of SV1 simulator:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "78a5c9f03581cea4", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.425542Z", - "start_time": "2023-11-21T08:32:41.422663Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['ccnot',\n", - " 'cnot',\n", - " 'cphaseshift',\n", - " 'cphaseshift00',\n", - " 'cphaseshift01',\n", - " 'cphaseshift10',\n", - " 'cswap',\n", - " 'cy',\n", - " 'cz',\n", - " 'ecr',\n", - " 'h',\n", - " 'i',\n", - " 'iswap',\n", - " 'pswap',\n", - " 'phaseshift',\n", - " 'rx',\n", - " 'ry',\n", - " 'rz',\n", - " 's',\n", - " 'si',\n", - " 'swap',\n", - " 't',\n", - " 'ti',\n", - " 'v',\n", - " 'vi',\n", - " 'x',\n", - " 'xx',\n", - " 'xy',\n", - " 'y',\n", - " 'yy',\n", - " 'z',\n", - " 'zz',\n", - " 'gpi',\n", - " 'gpi2',\n", - " 'ms']" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# supportedOperations\n", - "sv1.properties.action['braket.ir.openqasm.program'].supportedOperations" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "85fbc40dc254813e", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.463833Z", - "start_time": "2023-11-21T08:32:41.425725Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['braket_unitary_matrix',\n", - " 'braket_basis_rotation',\n", - " 'braket_result_type_sample',\n", - " 'braket_result_type_expectation',\n", - " 'braket_result_type_variance',\n", - " 'braket_result_type_probability',\n", - " 'braket_result_type_amplitude',\n", - " 'braket_result_type_adjoint_gradient']" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# supportedPragmas\n", - "sv1.properties.action['braket.ir.openqasm.program'].supportedPragmas" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "1fa721d9960f5412", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.464559Z", - "start_time": "2023-11-21T08:32:41.429030Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "['braket_result_type_state_vector',\n", - " 'braket_result_type_density_matrix',\n", - " 'braket_noise_amplitude_damping',\n", - " 'braket_noise_bit_flip',\n", - " 'braket_noise_depolarizing',\n", - " 'braket_noise_kraus',\n", - " 'braket_noise_pauli_channel',\n", - " 'braket_noise_generalized_amplitude_damping',\n", - " 'braket_noise_phase_flip',\n", - " 'braket_noise_phase_damping',\n", - " 'braket_noise_two_qubit_dephasing',\n", - " 'braket_noise_two_qubit_depolarizing']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# forbiddenPragmas\n", - "sv1.properties.action['braket.ir.openqasm.program'].forbiddenPragmas" - ] - }, - { - "cell_type": "markdown", - "id": "8190bb8089c7db3f", - "metadata": {}, - "source": [ - "The SV1 OpenQASM `action` field lists supported/forbidden OpenQASM features on the device, including `supportedPragmas`, `forbiddenPragmas`, `maximumQubitArrays`, `maximumClassicalArrays`, `requiresAllQubitsMeasurement`, `supportedResultTypes`, etc. The names are self-evident, but readers are encouraged to visit the [Amazon Braket developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-using.html) for full information of what these fields mean." - ] - }, - { - "cell_type": "markdown", - "id": "ee537a4601e4c244", - "metadata": {}, - "source": [ - "# OpenQASM features on Braket\n", - "\n", - "Braket supports many useful OpenQASM features, either through the OpenQASM program syntax or Braket-specific pragmas. We will walk through some of these features in this section.\n", - "\n", - "## Simulating Noise with OpenQASM\n", - "\n", - "With the fully on-demand, high-performance, density-matrix simulator [DM1](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-dm1), you can easily investigate the effects of realistic noise on your quantum programs. Now, we show how to use OpenQASM programs to leverage the circuit-level noise simulation capability of DM1.\n", - "\n", - "To simulate noise, we have to be able to specify different noise channels. Although syntax for noise channels is not available in the OpenQASM language, Braket uses the `pragma` statement to extend OpenQASM for defining noise channels. Here is an example of an OpenQASM program that prepares a noisy 3-qubit [GHZ state](https://en.wikipedia.org/wiki/Greenberger%E2%80%93Horne%E2%80%93Zeilinger_state):" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "4d8a62cfc51a18b", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.464621Z", - "start_time": "2023-11-21T08:32:41.431447Z" - } - }, - "outputs": [], - "source": [ - "noisy_ghz3_program = \"\"\"\n", - "// noisy_ghz3.qasm\n", - "// Prepare a 3 noisy qubit GHZ state\n", - "OPENQASM 3;\n", - "\n", - "qubit[3] q;\n", - "bit[3] c;\n", - "\n", - "h q[0];\n", - "#pragma braket noise depolarizing(0.1) q[0]\n", - "cnot q[0], q[1];\n", - "#pragma braket noise depolarizing(0.1) q[0]\n", - "#pragma braket noise depolarizing(0.1) q[1]\n", - "cnot q[1], q[2];\n", - "#pragma braket noise depolarizing(0.1) q[0]\n", - "#pragma braket noise depolarizing(0.1) q[1]\n", - "\n", - "c = measure q;\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "3a988726bb4c39e8", - "metadata": {}, - "source": [ - "In the example above, we inserted the depolarizing noise channel with probability of 0.1 after each gate in the circuit. The `noisy_ghz3_program` is equivalent to the following program in the Braket SDK:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "647e3717ccbba672", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:41.464801Z", - "start_time": "2023-11-21T08:32:41.434396Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Circuit('instructions': [Instruction('operator': H('qubit_count': 1), 'target': QubitSet([Qubit(0)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(0)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': CNot('qubit_count': 2), 'target': QubitSet([Qubit(0), Qubit(1)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(0)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(1)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': CNot('qubit_count': 2), 'target': QubitSet([Qubit(1), Qubit(2)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(1)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(2)]), 'control': QubitSet([]), 'control_state': (), 'power': 1)])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from braket.circuits import Circuit, noises\n", - "\n", - "noisy_ghz3_circ = Circuit().h(0).cnot(0, 1).cnot(1, 2)\n", - "noise = noises.Depolarizing(probability=0.1)\n", - "noisy_ghz3_circ.apply_gate_noise(noise)" - ] - }, - { - "cell_type": "markdown", - "id": "1db047fbac6a26bb", - "metadata": {}, - "source": [ - "To see if `noisy_ghz3_program` and `noisy_ghz3_circ` are indeed the same, we can run both circuits and compare the results:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "4c57de26c172aa5", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:42.963722Z", - "start_time": "2023-11-21T08:32:41.441098Z" - } - }, - "outputs": [], - "source": [ - "dm1 = AwsDevice(Devices.Amazon.DM1)\n", - "\n", - "noisy_ghz3_circ_task = dm1.run(noisy_ghz3_circ, shots = 10)\n", - "noisy_ghz3_program_task = dm1.run(OpenQASMProgram(source=noisy_ghz3_program), shots = 10)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "75984e0e95dc4afb", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:45.959888Z", - "start_time": "2023-11-21T08:32:42.975561Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "sdk measurement results: Counter({'111': 4, '000': 3, '101': 2, '100': 1})\n", - "openqasm measurement results: Counter({'111': 3, '000': 3, '100': 2, '011': 1, '010': 1})\n" - ] - } - ], - "source": [ - "sdk_result = noisy_ghz3_circ_task.result()\n", - "openqasm_result = noisy_ghz3_program_task.result()\n", - "sdk_measurement = sdk_result.measurement_counts\n", - "openqasm_measurement = openqasm_result.measurement_counts\n", - "print('sdk measurement results:', sdk_measurement)\n", - "print('openqasm measurement results:', openqasm_measurement)" - ] - }, - { - "cell_type": "markdown", - "id": "f2720672ca96b104", - "metadata": {}, - "source": [ - "As expected, the measurement counts of the two are very close.\n", - "\n", - "In addition to depolarizing noises, we can simulate more complicated noise types with Braket, e.g., `pauli_channel`, `amplitude_damping`, etc. Check the [Amazon Braket developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-using.html) for a complete list of noise channels supported on Braket. Here we give another example of general noise channels defined by the Kraus representation." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "f3231a7767d20640", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:45.971122Z", - "start_time": "2023-11-21T08:32:45.960859Z" - } - }, - "outputs": [], - "source": [ - "noisy_program_with_kraus_operators = \"\"\"\n", - "// noisy_program_with_kraus_operators\n", - "OPENQASM 3;\n", - "\n", - "qubit[2] q;\n", - "bit[2] c;\n", - "\n", - "h q[0];\n", - "#pragma braket noise kraus([[0.9486833, 0], [0, 0.9486833]], [[0, 0.31622777], [0.31622777, 0]]) q[0]\n", - "cnot q[0], q[1];\n", - "\n", - "c = measure q;\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "ebac8bbb6d45341d", - "metadata": {}, - "source": [ - "We inserted a single qubit noise channel defined by two 2x2 complex Kraus operators in the example above on qubit `q[0]`. Braket will validate if the Kraus operators indeed form a Completely-Positive and Trace-Preserving (CPTP) map." - ] - }, - { - "cell_type": "markdown", - "id": "ffa5e09c2ceab140", - "metadata": { - "collapsed": false - }, - "source": [ - "The `from_ir` method supports noise operations, including general Kraus operators." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "69c7ae1c396ac705", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:46.004276Z", - "start_time": "2023-11-21T08:32:45.977541Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "noisy_ghz3_program:\n", - "T : │ 0 │ 1 │ 2 │ 3 │\n", - " ┌───┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───┐ \n", - "q0 : ─┤ H ├─┤ DEPO(0.1) ├───●───┤ DEPO(0.1) ├─┤ DEPO(0.1) ├─────────────────────┤ M ├─\n", - " └───┘ └───────────┘ │ └───────────┘ └───────────┘ └───┘ \n", - " ┌─┴─┐ ┌───────────┐ ┌───────────┐ ┌───┐ \n", - "q1 : ─────────────────────┤ X ├─┤ DEPO(0.1) ├─────────────────●───┤ DEPO(0.1) ├─┤ M ├─\n", - " └───┘ └───────────┘ │ └───────────┘ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q2 : ───────────────────────────────────────────────────────┤ X ├───────────────┤ M ├─\n", - " └───┘ └───┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │\n", - "\n", - "noisy_program_with_kraus_operators:\n", - "T : │ 0 │ 1 │ 2 │\n", - " ┌───┐ ┌────┐ ┌───┐ \n", - "q0 : ─┤ H ├─┤ KR ├───●───┤ M ├─\n", - " └───┘ └────┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q1 : ──────────────┤ X ├─┤ M ├─\n", - " └───┘ └───┘ \n", - "T : │ 0 │ 1 │ 2 │\n", - "\n", - "Kraus operators:\n" - ] - }, - { - "data": { - "text/plain": [ - "[array([[0.9486833+0.j, 0. +0.j],\n", - " [0. +0.j, 0.9486833+0.j]]),\n", - " array([[0. +0.j, 0.31622777+0.j],\n", - " [0.31622777+0.j, 0. +0.j]])]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "print(\"noisy_ghz3_program:\")\n", - "print(Circuit.from_ir(noisy_ghz3_program))\n", - "print()\n", - "print(\"noisy_program_with_kraus_operators:\")\n", - "circuit_kraus = Circuit.from_ir(noisy_program_with_kraus_operators)\n", - "print(circuit_kraus)\n", - "print()\n", - "print(\"Kraus operators:\")\n", - "circuit_kraus.instructions[1].operator.to_matrix()" - ] - }, - { - "cell_type": "markdown", - "id": "a6b1ce4e1900550", - "metadata": {}, - "source": [ - "## Submitting parametrized quantum tasks with OpenQASM\n", - "\n", - "The on-demand [SV1 simulator](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-sv1) and [DM1 simulator](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-dm1) support submitting OpenQASM programs with free parameters. You can set the value of the parameter when you submit the quantum task, like so:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "71245a134d32fa26", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:46.007177Z", - "start_time": "2023-11-21T08:32:46.003030Z" - } - }, - "outputs": [], - "source": [ - "parameter_qasm = \"\"\"\n", - "OPENQASM 3.0;\n", - "input float alpha;\n", - "\n", - "bit[2] b;\n", - "qubit[2] q;\n", - "\n", - "h q[0];\n", - "h q[1];\n", - "rx(alpha) q[0];\n", - "rx(alpha) q[1];\n", - "b[0] = measure q[0];\n", - "b[1] = measure q[1];\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "bec130ddc2409db5", - "metadata": {}, - "source": [ - "The `input float alpha` line indicates that we have an input parameter of type `float` named `alpha`. We can specify a value for `alpha` when we submit the quantum task using the optional `inputs` argument to `run`. `input` should be a `dict` of `string`-`float` pairs." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "b831353ac6cfab2a", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:48.743543Z", - "start_time": "2023-11-21T08:32:46.007096Z" - }, - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'11': 4, '01': 3, '00': 2, '10': 1})\n" - ] - } - ], - "source": [ - "input_dict = {'alpha': 0.1}\n", - "param_sv1_task = sv1.run(OpenQASMProgram(source=parameter_qasm), shots = 10, inputs=input_dict)\n", - "param_sv1_result = param_sv1_task.result()\n", - "print(param_sv1_result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "id": "eb90a29d1debc7b4", - "metadata": {}, - "source": [ - "Similarly, we can specify values for parametrized noise operations:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "94f2688b3380c621", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:48.746739Z", - "start_time": "2023-11-21T08:32:48.743876Z" - } - }, - "outputs": [], - "source": [ - "parameter_noise_qasm = \"\"\"\n", - "OPENQASM 3.0;\n", - "input float beta;\n", - "input float alpha;\n", - "bit[2] b;\n", - "qubit[2] q;\n", - "h q[0];\n", - "h q[1];\n", - "rx(alpha) q[0];\n", - "rx(alpha) q[1];\n", - "#pragma braket noise bit_flip(beta) q[0]\n", - "b[0] = measure q[0];\n", - "b[1] = measure q[1];\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "101d366dca84ddb2", - "metadata": {}, - "source": [ - "We can see there are now two `input` lines, one for each free parameter." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "a0aa8a773b16dc22", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:51.579287Z", - "start_time": "2023-11-21T08:32:48.747668Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'01': 3, '11': 3, '10': 3, '00': 1})\n" - ] - } - ], - "source": [ - "noise_input_dict = {'alpha': 0.1, 'beta': 0.2}\n", - "param_dm1_task = dm1.run(OpenQASMProgram(source=parameter_qasm), shots = 10, inputs=noise_input_dict)\n", - "param_dm1_result = param_dm1_task.result()\n", - "print(param_dm1_result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "id": "7e60112ddc974a94", - "metadata": {}, - "source": [ - "## Simulating arbitrary unitaries with OpenQASM\n", - "\n", - "The on-demand [SV1 simulator](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-sv1) allows us to simulate arbitrary unitary gates in a circuit. With OpenQASM, we can use the `unitary` pramga to insert these arbitrary unitary gates: " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "ffc32efec9315f0", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:51.589214Z", - "start_time": "2023-11-21T08:32:51.579008Z" - } - }, - "outputs": [], - "source": [ - "program_with_unitary = \"\"\"\n", - "// noisy_program_with_kraus_operators\n", - "OPENQASM 3;\n", - "\n", - "qubit q;\n", - "bit c;\n", - "\n", - "#pragma braket unitary([[0, -1im], [1im, 0]]) q\n", - "c = measure q;\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "8c190474a6e28563", - "metadata": {}, - "source": [ - "The `1im` in the `unitary` pragma is the OpenQASM notation of the imaginary number $i$, thus, we were simply using the pragma to perform a Pauli Y gate. We can check it by submitting the above program to SV1." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "6d687471d81b2367", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:54.390589Z", - "start_time": "2023-11-21T08:32:51.586164Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'1': 10})\n" - ] - } - ], - "source": [ - "unitary_task = sv1.run(OpenQASMProgram(source=program_with_unitary), shots = 10)\n", - "unitary_result = unitary_task.result()\n", - "print(unitary_result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "id": "76f2897ec744dafb", - "metadata": {}, - "source": [ - "As expected, the Pauli Y gate flipped the initial 0 state to the 1 state." - ] - }, - { - "cell_type": "markdown", - "id": "111ead44155005a8", - "metadata": { - "collapsed": false - }, - "source": [ - "`from_ir` will reconstruct the unitary:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "7b631be4b6785b90", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:54.403015Z", - "start_time": "2023-11-21T08:32:54.398210Z" - }, - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0.+0.j, 0.-1.j],\n", - " [0.+1.j, 0.+0.j]])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "Circuit.from_ir(program_with_unitary).instructions[0].operator.to_matrix()" - ] - }, - { - "cell_type": "markdown", - "id": "ce9caf39", - "metadata": {}, - "source": [ - "## Measuring specific qubits with OpenQASM\n", - "\n", - "The Local State Vector Simulator and Local Density Matrix Simulator support submitting OpenQASM programs where a subset of the circuit's qubits can be measured, which is often called partial measurement. For example, you can create a two-qubit circuit and only measure the first qubit like so:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "d33a0cb6", - "metadata": {}, - "outputs": [], - "source": [ - "partial_measure_qasm = \"\"\"\n", - "OPENQASM 3.0;\n", - "bit[1] b;\n", - "qubit[2] q;\n", - "h q[0];\n", - "cnot q[0], q[1];\n", - "b[0] = measure q[0];\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "81247da3", - "metadata": {}, - "source": [ - "We can see that there are two qubits, `q[0]` and `q[1]` but we are only measuring qubit 0 here: `b[0] = measure q[0]`.\n", - "\n", - "Now we can run this on the local state vector simulator" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "d747fcb4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'1': 7, '0': 3})\n", - "Measured qubits: [0]\n" - ] - } - ], - "source": [ - "from braket.devices import LocalSimulator\n", - "\n", - "local_sim = LocalSimulator()\n", - "partial_measure_local_sim_task = local_sim.run(OpenQASMProgram(source=partial_measure_qasm), shots = 10)\n", - "partial_measure_local_sim_result = partial_measure_local_sim_task.result()\n", - "print(partial_measure_local_sim_result.measurement_counts)\n", - "print(\"Measured qubits: \", partial_measure_local_sim_result.measured_qubits)" - ] - }, - { - "cell_type": "markdown", - "id": "923c3cd7", - "metadata": {}, - "source": [ - "As expected, only the targeted qubits were measured. \n", - "\n", - "The OpenQASM program `partial_measure_qasm` is equivalent to the following `Circuit`:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "5b4e6ae6", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'0': 5, '1': 5})\n", - "Measured qubits: [0]\n" - ] - } - ], - "source": [ - "partial_measure = Circuit().h(0).cnot(0, 1).measure(0)\n", - "partial_measure_task = local_sim.run(partial_measure, shots=10)\n", - "partial_measure_result = partial_measure_task.result()\n", - "print(partial_measure_result.measurement_counts)\n", - "print(\"Measured qubits: \", partial_measure_result.measured_qubits)" - ] - }, - { - "cell_type": "markdown", - "id": "49b97636", - "metadata": {}, - "source": [ - "We can check whether a device supports partial measurement by inspecting the `requiresAllQubitsMeasurement` field in its action properties; if it is `False`, then partial measurement is supported." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "74a715eb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "AwsDevice(Devices.Rigetti.Ankaa2).properties.action['braket.ir.openqasm.program'].requiresAllQubitsMeasurement" - ] - }, - { - "cell_type": "markdown", - "id": "a6a94ac1", - "metadata": {}, - "source": [ - "Here, `requiresAllQubitsMeasurement` is `False`, which indicates that not all qubits must be measured." - ] - }, - { - "cell_type": "markdown", - "id": "8996e0c59741a66f", - "metadata": {}, - "source": [ - "## Qubit Rewiring with OpenQASM\n", - "\n", - "Amazon Braket supports the [physical qubit notation within OpenQASM](https://openqasm.com/language/types.html#physical-qubits) on Rigetti devices. When using physical qubits, you have to ensure that the qubits are indeed connected on the selected device. Alternatively, if qubit registers are used instead, the `PARTIAL` rewiring strategy is enabled by default on Rigetti devices. The following example shows how to use physical qubit notation in an OpenQASM program:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "144cc3e458a21b2d", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:54.410178Z", - "start_time": "2023-11-21T08:32:54.402877Z" - } - }, - "outputs": [], - "source": [ - "ghz_program_with_physical_qubits = \"\"\"\n", - "// Prepare a GHZ state\n", - "OPENQASM 3;\n", - "\n", - "bit[3] ro;\n", - "h $0;\n", - "cnot $0, $1;\n", - "cnot $1, $2;\n", - "ro[0] = measure $0;\n", - "ro[1] = measure $1;\n", - "ro[2] = measure $2;\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "3f01e6dc44e0e226", - "metadata": {}, - "source": [ - "We can run the above program on the Rigetti Ankaa-2 device," - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "768b980b78c4d451", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:55.489511Z", - "start_time": "2023-11-21T08:32:54.414005Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Measured qubits: [0, 1, 2]\n" - ] - } - ], - "source": [ - "# choose the quantum device\n", - "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "\n", - "ghz_program_with_physical_qubits_task = rigetti.run(OpenQASMProgram(source=ghz_program_with_physical_qubits), shots = 10)\n", - "measured_qubits = ghz_program_with_physical_qubits_task.result().measured_qubits\n", - "print(\"Measured qubits:\", measured_qubits)" - ] - }, - { - "cell_type": "markdown", - "id": "5a5597dc7843d541", - "metadata": {}, - "source": [ - "As we can see, physical qubits 0, 1 and 2 are indeed being used and measured." - ] - }, - { - "cell_type": "markdown", - "id": "25cb2ccc4337dc1e", - "metadata": {}, - "source": [ - "
\n", - " Note: This section and the next verbatim box section uses the Rigetti Ankaa-2 device. When you run this notebook, make sure the device is currently available. You can find QPU availability windows on the Devices page in the Amazon Braket Console\n", - "
" - ] - }, - { - "cell_type": "markdown", - "id": "9c30ec68828b17ff", - "metadata": {}, - "source": [ - "## Verbatim Compilation with OpenQASM\n", - "\n", - "In [a previous example notebook](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Verbatim_Compilation.ipynb), we talked about verbatim compilation on Braket to gain more precise control on Rigetti devices. With OpenQASM3.0, we can use the `box` syntax together with the `verbatim` pragma to perform verbatim compilation. Here is an example:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "a69ab8a7a04aa190", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:55.492060Z", - "start_time": "2023-11-21T08:32:55.489240Z" - } - }, - "outputs": [], - "source": [ - "program_with_verbatim_box = \"\"\"\n", - "OPENQASM 3;\n", - "\n", - "bit[2] ro;\n", - "#pragma braket verbatim\n", - "box{\n", - " rx(3.141592653589793) $0;\n", - " rx(3.141592653589793) $0;\n", - " iswap $0, $1;\n", - "}\n", - "ro[0] = measure $0;\n", - "ro[1] = measure $1;\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "d503dc700f00f7b7", - "metadata": {}, - "source": [ - "To program with verbatim boxes, we need to make sure that\n", - "- we are using native gates supported by Rigetti devices. Native gates can be found using the following script:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "a1cb1cb78d32b7b1", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:55.496864Z", - "start_time": "2023-11-21T08:32:55.493060Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The native gates for the Ankaa-2 device are:\n", - "rx\n", - "rz\n", - "cz\n", - "iswap\n" - ] - } - ], - "source": [ - "print(\"The native gates for the\", rigetti.name, \"device are:\")\n", - "for gate in rigetti.properties.paradigm.nativeGateSet:\n", - " print(gate)" - ] - }, - { - "cell_type": "markdown", - "id": "1d24104e29717209", - "metadata": {}, - "source": [ - "- we use the physical qubit notation.\n", - "- qubit operands are indeed connected on the physical device. Recall that the device qubit connectivity can be found using the following commands:" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "f6a7ffff1914fd03", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:56.296409Z", - "start_time": "2023-11-21T08:32:55.495523Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3jTZduGz4yme+89GGVPkY0gS0ABwQECoogiCiKKAvqqoOIAFBUEZAkqguNzASpDBNmC7A3ddO89k3x/lISmSdp0QNvkOY+D47W/lSd5M+7f81zXdUvUarUagUAgEAgEAoGglkgbegACgUAgEAgEgqaNKCgFAoFAIBAIBHVCFJQCgUAgEAgEgjohCkqBQCAQCAQCQZ0QBaVAIBAIBAKBoE6IglIgEAgEAoFAUCdEQSkQCAQCgUAgqBOioBQIBAKBQCAQ1AlRUAoEAoFAIBAI6oQoKAUCgUAgEAgEdUIUlAKBQCAQCASCOiEKSoFAIBAIBAJBnRAFpUAgEAgEAoGgToiCUiAQCAQCgUBQJ0RBKRAIBAKBQCCoE6KgFAgEAoFAIBDUCVFQCgQCgUAgEAjqhCgoBQKBQCAQCAR1QhSUAoFAIBAIBII6IQpKgUAgEAgEAkGdEAWlQCAQCAQCgaBOiIJSIBAIBAKBQFAnREEpEAgEAoFAIKgToqAUCAQCgUAgENQJUVAKBAKBQCAQCOqEKCgFAoFAIBAIBHVCFJQCgUAgEAgEgjohCkqBQCAQCAQCQZ0QBaVAIBAIBAKBoE6IglIgEAgEAoFAUCdEQSkQCAQCgUAgqBOioBQIBAKBQCAQ1AlRUAoEAoFAIBAI6oQoKAUCgUAgEAgEdUIUlAKBQCAQCASCOiEKSoFAIBAIBAJBnRAFpUAgEAgEAoGgTsgbegACyya/uIzo9HxKylQo5FJC3O2xtxZvS4FAIBAImhLil1twx7mWnMvmY7H8fSWF2IwC1BX2SYAgNzsGhHsxoXsQLbwdG2qYAoFAIBAITESiVqvV1R8mENSduIwCXvv5HAeupyGTSlCqjL/1NPv7NvfgvQfbE+hmdwdHKhAIBAKBoCaIglJwR9h6PJa3frtAmUpdZSFZGZlUglwqYeHItozrFnQbRygQCAQCgaC2iIJScNtZ8fc1lu66WufrzBnSkhkDWtTDiAQCgUAgENQnQkMpuK1sPR5bL8UkwNJdV/F0sOZRM5+pFEYlgUAgEDQ1xAyl4LYRl1HAoGX7KS5TGT2mrZ8TLw5sSbcQV6zlMmIzCthyPJaNh6MNHm8tl7Jn9j1mp6kURiWBQCAQNGVEQSm4bUxaf4zDkelGNZN9W3iw7vG7uJiQw/azieSXlBHsZodEIuGDPy8bPEcmldArzJ2vn+p+O4d+xxBGJYFAIBCYA6KgFNwWriXnMviTf4zud7CW8/fL9/BfTBbTv/2Pmr4L98zuR3Ovpj1TJ4xKtUNIAgQCgaDxIb6FBbeFzcdiq5xxG9XRD09HG5bsuoJaDbZWMorKlCYVljKphG+OxrJgZNt6HvWdoy5GJeXNAnTeT+dIyyu2CKOSkAQIBAJB40YUlILbwt9XUqqcdevd3IOcolJ8nKxZM6krzTwdyC8u4+dT8byz42KVukulSs3fV1NYgH5BGRcXx7Fjxxg7diwSiaRenkt9I4xKpmOKJEANxGQU8PWxGDYeiRaSAIFAIGgAxJK3oN7JKy6j/YKdVPXG+uOFvgS7l//gf3cijqORGfQIc+PJXqH8diaeF7aervIxJMD5BUOxt5ajUqnYs2cPn3/+Odu2bUOtVhMVFUVISEh9PaV6oyqjUo9QN7Y+09PgeQ+uPMSpuCyD+8zVqCQkAQKBQNB0EDOUgnonJj2/ymISwE4hw04h55ujMSzcdhGAnReSUMikTOgezMe7rxKdXmD0fDXw17GzXDy8iy+++ILo6GhkMhma+yMHB4d6ejY1Iz4+Hn9/f6P7X/v5HGXVFEdfHorizI1snW3R6flGjy9TqXnt53NmY1QCIQkQCASCpoYoKAX1TkkVy9UaikrLj/ntTILO9l9PJzChezBdglyrLCgBHh43npLEW0WHUqnU/vc999yDq6srHh4eeHl54ePjQ0BAAIGBgYSEhBAaGoqNjU1Nnla1HD58mN69e/PAAw/w6aefEhoaqrP/WnIuB66nVXudf6Mz+ON8ksmPq1SpOXA9jespuU3eqARCEiAQCARNEVFQCuodhVxa7THJuUWE+ziSllessz09v/xvZ1uraq/x0JjR/Lrxc/Lz9WfvoqKiuHLlik6RaQi5XI5CocDW1hZ7e3ucnZ1xcXExWIiGhYURHByMQqEweK3o6GgAfv/9d/7880/mz5/P3LlzsbMrX4quzqhUEXuFjKIylclLveZgVIJyScBbv10w+fjn+zfnlaHhXEnKZeinhlMF3vztAr2aeZidJMAYwgUvEAgaAvEtI6h3QtztkUCVy97n47Pp18ITbycbItNuFYRejuWzhun5JVU+hgRY89Ei1i9dyNKlS3n33XcpKytDqVQSGBhIbGys9ticnBwiIyOJiYkhNjaWhIQEkpKSSElJISMjg6ysLHJzc8nJySElJYWSkhJUKuOzrBKJBJlMhrW1tU4hWlBQPqOqVCpRKpW88847rFy5knfffZepU6dWa1TSsOShjjhYyylTqjgencl7f1ziXHx2lecYMypdunSJjz/+mO3bt3P06FGCg4OrffyGxBRJgAYfJxueH9CM/OKyKo8zR0lAZYQLXiAQNDTClCO4Ldyz5G9iMowvWbf1dWLHC3355XQ8L353Wrv900c7Mby9L70/3EtKbrHR84Pd7dg/Z4D275iYGGbPns3PP/9Mly5d+O+//+r8HDIyMrSFaFxcnLYQTU1N1SlECwoKKCoqoqSkBGMfJ4nClqDZ30MVzvMuQa5M7RPK31dSyCwooYWXI0/3DcNOIWPsqsNcSMypcrwao5KdQsbevXtZsmQJO3fuRCKRoFarOX78OHfddVddXpI6UVhYyJYtWxg7dizOzs56+6vLLq3M8nGdcbNXIJNKcLVTGJ2h1GAO2aWVEcH4AoGgsSAKSsFtYcFvF/j6WEyVP3AfjunAo90C2X42gaNRGfQIdeP+Dn58/vd1luy6YvQ8mVTCpO7BBpd39+/fj42NDd273/nZqBdeeIFVq1ZRVlaGVCpFpVJhb29Px44d6TtyPFuzQqu/SCWC3e3484V+/BudzuQvj1d7fNiV7zi++2fy8vK0haSGTz75hI4dO2qX893d3ZHJZDUeU2359ddfGT16NC4uLrzzzjtMmzYNK6tb0gZT3jMa7g5x49up3Rmx/CALR7attqCs6j3TVBEueIFA0JgQS96C28KE7kFsPBJd5TGv/3KOhOxCHu4awJA2PsRnFfL29gtsOFT1eUqVmok9DP8Q3nPPPbUccd3JyMigrKx8+bV3797MmDGD0aNHo1AoOBWbydZVh2t8zZj0AnZfSmJoWx+kEqiubjh6/ASFeXkAerOlL774osFzNEv4crlcqylVKBTY2NhgY2ODnZ0d9vb22Nvb4+joiJOTE05OTri4uODq6oqbmxtubm54eHjg6emJl5eXVjdakZyc8hnWrKwsZs6cybJly/j4448ZOXIkEonEZEmAVAILR7bluxNxXEnOrfZ4qDq7tCkiXPACgaCxIQpKwW2hhbcjfZt7VNnLu0yl5tO/rvHpX9dMvq6ml3djXLocO3Ysnp6ePP3007Rp00ZnnylGJWMkZBVhLS+PWcqrRi/475HD/PfXr7z66qukpKTo7Pvkk08oKSkhKyuL7OxscnJyyM3NJTc3l/z8fAoKCigsLKSoqIiioiIyMzMpLS3ValNVKpXRJX1DSCQSpFKptlitrEuNjIxk9OjRODs7M2nK08RY9zfpuhO6B+PvYsuE9cdMHgtAbHoB+cVlWoOKWq3myJEjfPHFF/z888/8+uuvDBgwoJqrNDzCBS8QCBojoqAU3Dbee7A9g5btr9FyXHXIpRLee7B9vV2vPnnwwQd58MEHDe4zxahkjCA3O4pKleSXVF1MSoBQTwfaTZ7Mww8/zMcff8yiRYsoKioC4Nlnn8Xa2roWI9ClsLCQlJQUUlNTSU9PJy0tjczMTDIzM8nKyiInJ0dbrObn52uL1aSkJO1YKpKdnc36737F6/H+1T62i50VLw1uyWd7r5FRjXGrMmrK8zz9bFV88803rFy5ksuXLyOTyVAqldoZ1MZMVS74Fl4OvDioJe39nfF0sKawVMm1lFzW/BPJX5dTDJ4DwgUvXPACQf0gPkWC20agmx0LR7Zl3k/n6u2ab49s2yR/+Oyt5QS52VVpVHKzV+gVSa19HBnU2pv9V1Oq7XMe5G6n/WG0s7Pjf//7H1OnTuWNN97g8uXLRuOOaoqtrS3BwcE1dowvWLCAd999F6VSiVQqRaFQMHXqVF588UVyrNx40ARJwJzB4WQVlLKpGjmFMQYMHEzqZV0tqiZa6vTp0/j5+REeHo6Tk1Otrl9XkpKS8PLyQio1PKNdlQve39UWB2sZ/3fyBsk5RdhaybivnQ/rJ3dj/k9n2XI8zuB5wgUvXPACQX0gCkrBbWVctyDS8orrZYnulSHhTXppbkC4V5WmkxXjO1NUquK/mEzS84tp4eXA+LuDKCpV8sGfxk1KUC4FGNDSS2+7j48Pa9eurZfx15WSkhKUSiXe3t689NJLPP3007i6ugJwIaHqWCSAEHc7xt8dxNvbL+LteCuU3louRS6TEOBiS25xGdmFpUav4exoT6qRfQsWLGDBggXav+VyOTY2Njg4OODk5IS7uzteXl74+voSGBhIaGgozZs3r7cCNCMjg6CgIDp27MiaNWvo3Lmzzv7qgvH3XUll3xXdZ7fpSDTbZ/Rhap8wowWluQXjV0T0ghcI7hzC5S24I9TVkfr2yLZNupiE6mNxnugVwuhOfgS72+NgLScjv4RDEWl8+tc1YqrpGgSNPxYnLi6OU6dOMWzYMB13N5QvQ7arpv97Vb3ONWw4FMXb2y8a3KeJVYqLus706dPZt2+fjhN+9erVJCcnc+PGDRISErTxUDk5OeTn51NcXKw1XRnCysoKa2trvQLUz89PpwBt1aqVwdagZ8+epWPHjkilUtRqNc8//zzvvvuuNmKpJi74iqx7/C46BjjT7b2/jB4jXPC3EC54gaB2iIJScMeIyyhgxqZDnEkpQYoaFcYzGc01M2/S+mNVGpVqg8ao1NSXLKvLLnW1s6JbiJve9pcHh2NvLePt7ReJSS8w6vyumF2qVqv57rvvmDlzJmlpacjlckpKSpBUkROqIS0tjStXrnD9+nWio6O5ceMGiYmJ2qD8nJwcbTZpVZ2arKyssLGx0Qbjy2QyLl68VQxLJBKcnZ356KOPePLJJ+m/dF+Vr48GWysZNlZSHG2sGNzam/nDWrH9XKJO3mt1r09Tpy4u+IrMGdJSuOAFAhMRBaXgtpOZmQlAUVERzZs3p9TWnZdW/cyRmBxi0w3omdztGNDSi4k9ghr1jFttiMsoYNCy/RSb0O/cVKzlUvbMvqfJF921nYHb+nSPWudQZmdn89Zbb5GWlsY333xTq3FXR2pqKleuXCEiIoKoqChtAVp5BrSwsNCoi97K1gG/F7ZUGYyvYdHodkzoXq5vVarU/Hkhifk/nSWnqHpT1/kFQ3UMKpcuXWLNmjV8//33rF27luHDh5v+xBuIrcdj61W3/eGY9k1+dcRUhGFJUBfEO0Vw23nooYfYv38/CoWCwsJCKCjgue6efPBwV4v7AhNGJeOYkl1aW4xllzo7O/PJJ5/clsfU4OnpiaenJ3369KnyuM8++4wXX3xRp6iUyWSEhobS/b6xHDShmITyZf/fzyXi7WTDiA6+yCQSk2KrNC74MFcF//d//8eqVas4fPiw1gWfmmpMfdp4qMoF3yHAmbFdAugZ5k6Aqy2ZBaWcis3ko91XiarQ/rUy5u6CF4YlQX1R+3A8gcBENEt/hYWF2m0LFy4kISEBe2s5bf2c6RzkSls/Z7MuJjWM6xbEnCEt6+VaTd2oVBFNdqlMalrhpGHc2qPVzk72be7R6Ge7U1NTtcVkq1at+Oyzz0hNTeXatWu8/Mpck68TkZrPoYh0fjoVz1ObTmBnLWPd491MOve+4fdjb2/PpEmTOHy43HWvWbaPi4sjJiamyj73txOlUmkwdqoiVbngn+3XjGFtfTgUkcbCbRfZ8m8s3UPd2D6jDy299TWtGjQueHMjLqOASeuPMfiTf/j6WAwxlYpJ0DUsDf7kHyatP0acCbILgWUilrwFt5V9+/YxePBgg2aG8ePH8+233zbAqBoHwqikjyVLAg4cOMCWLVuYNGkSPXr00NFzXkjIZsTyg7W67vhugbw/pgP3frSPyCpm4gDku5cQ8d/+aq8plUqxtrbGzs4OJycn3Nzc8PT0xNfXl6CgIEJCQrQGJA8Pj1qNuzIfffQRb7zxBm+//TazZs3SM3ZVZ3rrEuTKufgsSpW3Pmsh7nbsnNWP388nMfv701U+fmM3vdUEYVgyHUtbRasL4lUR3FamTZtmsJh0d3fnvffea4ARNR7GdQuidzMPbayJWqVEIjXeW1tjVOoV5m5WRqWKWLIkoG/fvvTt29fgvroE49tYlb+nHG2q/rqXAGcO7SE28hrPPvss//yjW5y98cYb5ObmcuPGDZKTk0lPTycrK4v09HRu3LhBWVmZUQ2oXC7H2tpaa0Byd3fH29sbPz8/goKCCA0NpWXLloSHhxts2wlw+fJlioqKePXVV1m/fj1r167VkRFsPhZrNBoI4GRspt626PQCrqbk0dzL+AwllH/2vjkaaxYueNG2s3qEDKB2iIJScFv59ddftREtFXniiScICQlpkDE1FnJycghwdWRKWAHfzZ2OT9+HCel9v8UZlSojskv1MSUY391eQXqlYHy5VMKYLgEUlii5lpJX5WNogvFbt27Nvn37+Pbbb5k1axbp6ekAzJ8/H1tb2yqvkZeXp3XAR0ZGEhsbS0JCAsnJyWRkZJCdnU1CQgJRUVFGI5gkEonWAe/g4ICLiwseHh5cv35dW7BevXqVvn37MmnSJD766CM8PT1N7gVfGQ8HBdeSq35tquoFX1ZWRl5eHi4uLjV+7DuNaNtZNSK3tG6IJW/Bbefnn39mzJgxALi6upKVlcW8efMseoYyLS0Nb29vPDw8SEtLQ6VS0aFDB86cOSOWWG4iJAG6VOeC/2JiVxys5fwbnUFSdhGejtaM7uRPcy8H3tlxkfUHo4xe25gLPisri//9739cuXKF3bt31+vzAUhJSeHq1atcu3aNqKgo4uLitA74zMxMbQRTcXFxldrN8HYdKbr/XagiiswQozv588mjnXjlxzP88N+NKo+t7IJPTExk7dq1fP755wAkJyfX6LHvNFXJSewUMqb1C6NToAsdA1xwsVMw54cz/Hiy6tekqchJTEHIAOqO5f1KCW4rhoqhxMREoNxocPr0aXJycnB0NO9ZtuqwsbFBpVKRknKrx/Lly5d5//33eeGFF2jr59yAo2scCEmALtW54LefTeCRuwKZ2D0IFzsF+cVlnIvP5oM/L7HnkvFe3mDcBe/i4sKKFSvqOnSjeHl54eXlVa0DHiAoKIi4uPJuP5pAeoVCQUhICF3vGcqhGhaTzTzteXtUW/6LyeT/qimc4KYLPi2f1GunWLFiBb/88gtQbhbSdHxqzFRlWHKzUzBrYEtuZBZwKTGXns3cTbqmubTtFDKA+kEUlII6U53exFblgc+Imfyw6k2sra3x9PRsqKE2Gvbv1zc+lJSU8NprrxESEsL48eMbYFSNi7y8PKzLCvhqyt0069KHbI/2tB3yCHEZhRYpCdC44I0F4287m8i2s4k1vq4mGL+xv26apXeAe++9l+nTp/PAAw+gUCg4FZvJIRN6wWvwdLBmw+Ru5BaVMX3zf5g6IXVX9x4UxV/W215WVsZrr72m7YoUHBxMWFjYHesJv3LlSvbs2cMHH3xAy5b6CRLVte1MyS2m26I9pOYV097fmW0zqi/wwTzadgoZQP0hlrwFtcYUvYkGTWccoTeBqKgoWrZsadT5/vXXXyOTGZ+JsxSefPJJNm7ciLe3t3Y5UalUUliqslhJgCW74KdPn46bmxtTp04lNDRUZ19NXPCO1nK2PtMDPxdbHv7iCNer0ZZWJPeH18iIOFujcctkMq0m1M7ODkdHR5ydnbXOeG9vb3x9fQkICCA4OJjQ0FA8PDyQSk1P9Rs+fDh//PEHcrmcl156iTfeeEOnvWdNmgZoCkpTlryhabftrO7zpJBJeWlwSx7s7I+zrRWXk3JYuusqB6sozpvK5+l2YBnfwoJ6p6LeBKj2i0rTZvFwZDqDlu23aL2Jn58fs2bNYsWKFRQXF+vsmzlzpigmb6LpYV1Rm9ahQwfmzp3LpEmTGmpYDYolu+BXrVpldJ+pLnhruZR1k+8i1MOeieuP1aiYlACxF/7j8D9/89xzzxEREaE1CQ0dOpSPPvqImJgY4uLiiI+PJykpidTUVK0bPicnh7y8PLKzs4mIiECpVBp1xUN5NJOmP7ydnR0ODg44Ozvj6uqKh4cHPj4++Pr64u/vT2RkJFA+U7p06VI2bdrEsmXLGDduHBKJpNaGJVMwZliKj49n+fLlODs7M3/+/Nvy2HWlKhkAwNKHOzCsnS8bDkURnZbPQ10D+fKJboxfe5QTMfqpAWA+MoDaIApKQY0RepO6YW1tzdKlSyktLeWzzz4DQKFQUFJSQlZWVsMOrpGgVqs5d06/aLpw4QKffPKJxRaUIFzwhjDFBS+VwIrxnekS5MrTX5/gZGxWjR5D44IfPHgwFy5c4LPPPuPNN9+ksLAQLy8v2rZtS9u2NZulKykpIS4ujsjISG7cuEF8fLy2L3x6errWmJSXl0dSUhKxsbGUlpZWWYiqVCqSk5N57LHHePLJJxn98DhiAh6u0bhqSmx6AfnFZdhbyzlz5gxLly5ly5YtKJVKWrRo0SAF5c8//4yfnx/duxsu7KqTAXQMcGZkR38W/X6JtQfKC/afTsWz88V+zB/WmrGrDUsszEEGUFtEQSmoEUJvUn/ExMQA5a0pv/nmG86cOUOnTp0adlCNhAULFrB371697W5ubvz6668NMKLGxYwBLfBwsBYu+AoMCPeqcln3fyPaMLiND7svJuNiq2B0J3+d/b+cjjd6bZlUwoCWXtq/FQoFc+bMYcKECSxatIhhw4bVaswKhYJmzZrRrFmzGp2nUqlISEggOjqamJgYpk6darCLkJWVFZEpORBQq+GZjBqY9+5H7PvlG86fP49UKtW68u3t7W/vgxth4sSJFBQUMHbsWD788EO917i63NJh7XwpU6rY8m+sdltxmYrvj8fx6n2t8HW2ITHbcOcmc8otrQmioBSYjKZPrqkRE+O6BfJgJ3/CPB1wspWTklPM0ch0Pv3rGjeyytswmnufXA2G3O9qtZqAgAC+//57JBIJd999d0MPs9EQFWU44mbUqFEEBNzmX8cmQmUXPColCBe80f1tfMsNMoPbeDO4jbfe/qoKSmMueF9f39vqgjeGVColICCAgIAAevXqxeOPP67d5+bmxvTp03nmmWcICgriVGwmD9bAsFRb1qzfQEli+WRDxYin06dPI5VKtf/kcjlyuRwrKysUCgXW1tbY2NhgY2ODra0t9vb22n9OTk44Ojri6OiIq6srzs7OuLi44O7ujpubm/Z/5XLdUkatVmtb/f7666/8+uuvPPfcc7z55pu4u5c72KuTAbT1cyIqLZ+8Yl2t++kbWUD5+8lYQVlVbqk5IwpKgclo9CaeDtYmRUy09XMmLrOA3ZeSyS4sJdDNjvHdArm3lRfDPjtASm6xWetNqnO/27WayD33TOF6Sp7otlCJr776ioULFxIWFqazvbFn/d1JlEolpVlJbHqyG3Pe+YiNB68T1vt+0oulwgVvoFAYt/Zora7b2F3wKpUKT09PwsLCmDlzJmPGjMHa2lq7XyE33dxTF56b9gxbVy8lKSlJZ7uPjw+dO3emoKCA/Px8ioqKtP9KSkrIzs4mLS2NsrIylEolKpWqVv3iJRIJUqkUmUyGVCrVygI05sfPPvuMFStW0LlzZ0Y/PI7YrNZVXs/L0YaU3GK97Zpt3k42VZ5fUQZgKVjOMxXUiYp6E1MjJt749bzetl0Xktg+sy9juwSwan+EWepNTO22kC+140i6hMGf/CPc7wYIDQ3VOl0PHTrEiRMnDEaiWCq7du1i+PDhuLi4aLW3b84cwcChQy3WBf/eg+0ZtGx/vRpQ5FIJ7z3Yvt6uV9/I5XISExN1er9XpC5tO01FArw7bxZL//ciGzduZP78+aSnp6NSqejTpw8//PBDja+pUqnIy8sjPT1d+y8rK4usrCyttjQ3N1erMc3Ly6OgoIDCwkJycnK4du2awWueOXOGxCIZVg+8WeXj21hJKVHqF7bFpUrt/qpQA9Hp+RaVKWwZ3zKCOlNRb1KiVJGap3/nZgqapW6nCn2FzUlvUlP3u2a/cL/rywLkRZmoVCqWLVtGjx496NGjR0MPsVHh4eEBoGPkeuihhxgzZgwrV67Ezc2tgUbWcFiqC95YMQmmGZbqisawBPDUU08xbtw4Pv74Yz744AP8/f2rOdswUqkUJycnnJyc9GKiqiM2Npbg4GCgvOBWKpWMGDGCV155hb59+3I6LqtaGUBRqQqFTL9otLaSafdXR0k9xns1BURBKTCJusROuNhZIZNI8HOx5YV7y13dhyJuhRSbi95EuN9rTnWygPCXt5AS2IpryblCFlAJQ8uCpaWl/PTTTyxatMgiC0oQLnhDVGdYAni8ZzBONlbapdyBrb3wcS7/702Ho8ktNtx7vbJhCcqNOG+88QazZ8/Gysqqnp6F6WiWuRUKBU888QQvvfQS4eHh2v2myABScovwMbCs7eVYLidIzjGsn6zInZIbNBZEQSmolrziMmLrcHd7bN5A7V1dRn4Jb/12QS8Y1pDe5MSJE2zYsIFRo0YxdOjQWj/+nUC432uGqbKAIitHvjuZwLcn4oUsoAIRERGMGDHC4L5ffvmlxq5hc0O44HWpzrAE8EzfMAJcb322hrXzZVg7XwB+ORVvtKA0ZlgCdMLV7yShoaFs27aN7t27G+zMZooM4GJiDj3D3HGwlusYczoFumj3V4Xk5uNYEqKgFFRLTHp+nfQ3T2w8jrVcSjMvBx7s5I+dQt+JqtGbhLpYsXXrVpYvX87p06eB8iWLxlxQ1sT9LpHA2M4BDG3rQ1s/J1zsrIjLKGTb2QTWHojUdmwwZ/e7kAXUnYMHD+q0ItRgb2/P8OHDG2BEjQ/hgr9FdYYlgD6L/67xdRurYUkikXD//fcb3W+KDOCP80lM69eM8XcHaXMoFTIpD3cN5FRsplGHt4aKMgBLwbLmYwW1oq46kCOR6ey7msr6g1E89+1JZg1sweM9g/WOG/fYRFxdXXnqqae0xaRMJtPGPDQE8fHxBsXdFdG4393sFMwa2JJmng5cSsw1eKytlYylD3fE3UHB5mOxvL39ImduZDF7UEs2PnErNkjjfjc3Vvx9jXk/naO4TFVjCYVSpaa4TMW8n86x4u+q/z8xdyZPnszVq1f1oqby8/MNFpqWSqCbHV8/1Z2PB7qSc3IHrlZlVFYbSoBgdzsmdQ9mz+x+fP1Ud7MqJjW892B75FLjWsva0NgNS1UxINwLWRWvx+m4LLafTeDVoeHMu68V47sF8u3U7gS42vL+H/r93CtiSAZgCVhW+SyoFfWpA4nNKOBCQg6jO/nz1ZEYnX1XLl2gtKREZ5tSqWThwoW8//772NjYaLPJNFlkXl5e+Pj4EBAQQFBQEKGhoTRr1gwbm6ojHUxl5syZ/PLLLzz//PO88847uLi46Oyvqfu9VKlizKrDnIy91bZr6/E4bmQW8NLgcHo3c+dQRLpZut+FLKB+adGiBT4+PgDMmjWLjh07cuXKFVxdXRt4ZI2DqKgoHn30Udq1a8cPP/xAXl4eHzzclQmTp1ikC95SDUvGMEUG8PIPZ4jPKmTMzV7el5JyeWrTcf6NzqjyvKpkAOaM+X+KBHWmvmMnbKykeu45CbDkzVdZ+MZrZGbq9kht1aoVVlZWZGdnk5eXR2xsLNevX9cKr40hl8uxtrbG1tZW2wfXzc1N2wfXz8+PwMBAQkJCaNasGV5eXtqYGg2xsbGo1WpWrVrF5s2b+eijj5g8ebL2uJq630uVap1iUsPOC8m8NDic5l6OWsNSVe73kpIS1Gq1Tt5cY6amofgdA5x5qGsgnQJdaOXjiJVMSsj8HTrHmLMswBCGwvEVCgUtW7bkk08+aejhNTry8vI4fvw4x48f125bsGABMTExvPLKK7i4WF7hLQxLtzBFBlBcpuL9Py5XOyNZkcYqA7gTiIJSUC21iZ2QSSXYK2TkFOkWfR0DnAn3duTXMwk624Pc7Zj1/LM8NXkib7/9NsuWLdMG3H7yyScMGTLE4OMUFBQQGRlJZGQksbGxer1ws7KyyM3NJSMjg8TEREpLS6sMzZVKpVhZWWlnQ1NSUoDymdLMzEymTJnCwoULeeONNxg5ciR76+B+r4jnTedgZsGtGVpD7ve0tDRWrVrFJ598QseOHQ22J2yM1DQUf0C4F4/eFcjlpBxiMwpo5qkv7jfnUHwN1bngncIfo3ufx4UL3gCtWrXSaQEIkJiYyHvvvcfdd9/NqFGjGnB0DYcwLN3CEnNLbyeioBSYROXYieoiJiQSODJvINvPJnI1JZfCEiXhPo483DWA3OIylu+9pYGrqDdxcHBg8eLFTJkyheeff569e/dq88QMYWdnR7t27WjXrp3Jz0XTBzcyMpLo6Ghu3LhBQkICycnJpKamkpmZqZ0NNTQLqumdK1HYEvTS96Cnyqo50/qFkVNUyr4rKTrbNe73+JhIPv74YzZu3KgtinNzDes07yRqtZo5c+bQvn17Jk2ahEymb3qoTSj+N8diWLU/guIyFQtHtjVYUJqjLECDqS74bKWCQykiHN8Q7777rsGbx6lTpzJy5MgGGFHjobJhSSYBZRU1lbkaloQMoH4RBaXAJCrrTaqLmEjOLeK7E3H0DHNnWHsfbOQyUnKL+O1MAiv2XtcGnINhvUmrVq3Ys2cPSUlJ+Pr61utzqdgHt1+/fkaPUyqVWFlZaVt4SSQS5HI5ffr0YdiwYdj5t2TJuboXk8/1b0bfFp7875dzejO6aiCwdRcyo/S/8BISEpg3bx7Ozs44Ozvj6uqKq6sr7u7ueHh44O7ujoODg94yfn1SWFjIxx9/DMDSpUtZtmwZgwcP1jmmNqH4aXkl1R4D5hWKr0G44OvOyZMnefvttw3ue/PNN6sMArcUNIala8m5zPjkO85nqFG4+Vlc204hA6g/REEpMInKehNTIibe3n6x2mOq0ptIJJJ6LyZrQk5OjraYDAkJYcaMGTzxxBNa1/mp2Ew4V3W3heq4v70vcwaHs/V4LN8cizV4TEGx4eIqISGBDz/80KTHkUqlSKVS5HI5crkcKysrFAoFCoUCGxsbbGxssLOzw87ODnt7exwcHHB0dMTR0RFnZ2dcXFxwcXHB1dUVNzc3bdFacQbo0qVLDBkyhEGDBvHxxx/Tvn35sk9dQvGrw1govlqt5vTp03h5edW6U0dDIMLx64d27dqxZMkSNmzYwKVLl3T2nTlzhsDAwAYaWePh4sWL/PjjjzRv3py9S6dTVlZGVl4hN7KLLc6wJGQA9YP5v1ME9Yal6U1cXFxYunQpHTp0YODAgXozfXV1v/dp7sFHj3Rk75UUXv9Fv++5hsMH/2H391/yzjvvUFRUhFKpRCKRMHr0aN5//33S09PJyMggMzNT2+s2JydHu2yfm5tLQUEB+fn5FBYWUlhYSHFxMcXFxeTl5ZGZmUlZWRllZWVa3Wpt0Jy3Z88eOnTogJeXFwOGDCM24OFaXc9UKobi5+TksHnzZlauXMn58+eZPHkyGzduvK2PX18IF3z9oVAomDNnDoMHD6ZTp05YWVkxbdo0zpw5o3XGWzp//PEHb731ls62B4YNYdSoUcycOROFQtFAI2sY9GQARqQmGsxVBlAXREEpMBlL05tIJBJefvllo/vr4n7vFOjCFxO7cu5GNs9/e9LoF5cECPdzo8vcuUyZMoW3336bVatWoVQqcXNz02knVp+oVCoKCgpITU0lPT1da3DKyMjQFqw5OTnExcWxbds2/XFLJCgUCjJKpPWWDmAMNfDznoP8/dPXfPvttxQXly+pS6VS7Owa53urMhoXPGCyEx6gmacDb97fmruC3ShVqth7JYV3d1wiI7/E4lzwoO+ET0orT1RYt24djz/+eAOPrnHRt29fvW0HDhzg4MGDjBo1iubNmzfAqBqWQDc73uznxn++hZzMtefbv88gd/Ep70hxE0uQAdQWUVAKaoTQm9yiNu53KC8CNkzuxo3MQqZsOq7tjmOIit0WPD09Wb58OTNnzuS9996rshNEXZFKpTg4OODg4EBoaKjR406cOMG2bduQSCSo1Wq8vb156aWXeOaZZ3BxceFUbCYPrqqbLMAUnnp6GiWJuu9JtVrNtm3bSExMxNfXl8DAQMLCwmjWrBmtWrW6Y23hVCoV3377LcOHDzfaX1vjgge0AfnVOeF9nGz4/pke5BaXsWTXFewUMp7pG0Yrb0dGrTxkES54qNoJD2qCZ3zJdefOwglfiYSEBIPbFy5caJHFpIYpU6Zw8OBB7d92zq7c99AkOnftxoOjHrAYGUBtEK+KoMZo9CZv/HwWpRpUNXA5m5vepKbud5VazVdT7sbZ1oo1/0RwbytvnevFZuRzMjYLMN5toWXLlo1mGVeTg9m2bVvmzp3LI488orNUVp+h+FXh7+tNVKL+TU5CQgK//PKL0fOsrKywtrbWySn18vLC19eXoKAgQkJCaN68Oa1atcLRsXbFyL///sukSZNwcXHh448/1skxBV0XPJjuhH9+QHPsFHIeWHGQhJtt4M7EZbF5ag8e6hLAluNxZuuCB9Oc8CABB082/xvHV0djhRP+JnFxcUycOFFvu0QiYdasWQ0wosZDv379dArKguxMflr/Gf/uDOB/0/VfM8EtREEpqBV9fKUkb5xJ+MSFpMrcLVZvUlP3O4C/iy0A84a11rvej//FaQvKptBtoX379sTGxhIQEGDQOVvfofiGkADnDu/l38MHmDZtGtevX9eaqbZs2cIjjzxCSkoKV69eJSIigujoaOLi4khMTNSJibpx4wYRERFVBubL5XJsbGxwcHDAyclJ263J19eXgIAAQkNDadGiBeHh4Tg5OQGQnJwMQFZWFlOmTGHNmjV88cUXdOjQAdB1wQMmO+Hva+vDX5eTtcUkwKGIdCJS8xjRwY8tx+PM0gUPwglfV/Lz8/H29iYyMlJnu1qt5tChQwwbNqyBRtbw3H///bz33nt629euXdsAo2laiIJSUGPOnDlDjx49KCoq4ofn+lFq616+5HQ1hdh0/fBlc9ab1Mb9XrnjiyGaUreFqhyztZUF1ASNLGDAgAGcP3+eZcuWsWDBAoqKivD09ATAy8sLLy8v+vQxPNtXmbS0NK5cucL169e1WaWaAjQjI4OcnBzi4+OJjIystgCtnM157NgxOnXqRM+ePXnvvffYc6m0xkY3bydrPB2tORefrbfvzI0sBoSXz2wbc8FrSEhIwMfH57ZGS9U3wglfd1q1akVERATHjx/X9oMfMGAAUVFRWFlZNfDoGpb/+7//09vWrVs37rvvvgYYTdNCFJQCk1Gr1axYsYKXXnpJ+yPq7++PlZUVC0a2ZQFtDbaHM3e9iaW532tKTWUBucVl+LvY8mDn8rifDv7OAMwYUK7ris8q5Oebs72VZQEKhYK5c+cyfvx4tmzZQu/evWs1Zg8PDzw8PEw+Pz093WABmpKSQkREhNYoBGhnTw8fPsyAIcMInP19jXMRvRzLX6+UXP2ZzJScYlztFChkUkqUKh0XPEB2djabN29m9erVnDt3jr/++ot77723Ro/fUAgnfN2p+B2tdPJFYmXDI2NGsXXr1oYeWoOzb98+PvroI73tOTk5DTCapod5/9IL6o3U1FSeeOIJfv/9d53tlWdf7K3ltPVzvpNDa3Aszf1eU2oqC8gtLiPQ1ZY5Q3Qd7Jq/j0amawtKY7KAoKAg5s6dW99PxSju7u706tWLXr166e2bPXs2y5cvR6lUIpPJUKlU9O/fn2HDhhHUoRdz92XV+PFsrMpnFEsMGLo0Ji8bq/KCUg1EpeaRHXOBNWvW8N1331FScivbtKnMTlZ0whuinZ8TrwwNp0uQKxKJhJOxmXzwx2UuJhovBizFCV+VcSnwpR+IcbJiwW8XmNA9yKKNSzdu3EChUOh8PiQSifZm0ZLNSqYgCkpBtfz77790795dbxZFE5YtEO73qqiNLOBoVEa10oCmIgvIzs5GqVTi6enJtGnTeOqppwgJCQFuhuPvq7kLvqi0vGg0ZHqyvrlNcwzAXd17UJxwxeC11q9fz6lTp2jWrBmtW7cmNDQUufzO/jSo1WpKSkq0Ji9DVHTCV6atnxM/PtuLhOxCPv3rGlKJhEk9gtn6TA9Gf36IyLR8g+eZuxPeFOOSRCIhMbeMr4/FsPFItEUblyZOnMhjjz3GtWvXaNWqFWFhYQwdOpTk5ORam/IsCVFQCqolMTERuLVUp8FQ32ZLRuN+f/2nM5Sp1Eikpr8+5uZ+r4wlywLmzp3L2LFjGTJkiJ4+rbYu+JTcciOOl6N+AeblZE1mQQklylsFZZ9ePdj383WUSqXe8d988w3ffPONzjapVIq1tTV2dnY4OztrzUcBAQEEBwcTFhZGeHg4rVq1wsbGplbPoSI///wz48aNY/78+cyfP1/vmpWd8JV5eXA4RaVKxqw6TFZBafk1T8fz98v9eWVoONM3nzR4njn3gxfGpZqjkQPEZCmx8grls5VfMGLooIYeVpNBFJSCajHW/lCtVqNWq0Vf3AoUXdhL7Kp5hDw8n1KP5hbrfq+MJcsCwsPDjQbQ19YFn5xTTNrNWKHKdAxw4WLCrWVeCfDrN+sozv+Y+fPns2bNGmQyGUqlEqlUSlRUFFeuXOHatWtERUXpGJCysrJITU0lLi6O0tJSg2PRhNjb2tri5OSEm5sbnp6e+Pn5ERQURGhoKC1btqRt27a4uLgYvMbFixcpKyvjnXfeYdOmTaxZs4YhQ4Zo91d2wlemW4gr+6+maotJgNTcYo5FpXNvKy/sFDIKSvSLaTDPfvDCuGQ6xuQAflOWM2NfMYvP/s2AcC+LlwOYgigoBdVizMWqVCopKirC1tb2Do+o8VFcXMyrr77KZ599BsD9DtE89+IUi3W/G0LIAvSpiwv+z/NJjO0SgK+zDYk3o4N6NXMvD84/GKU9TuOCt7d244svvuCJJ55g6tSpXLx4EXd3d4KCgggKCmLw4MHVPmZGRgaXLl3i6tWrREVFERMTozUfZWZmkpOTQ3JyMmfOnNFb0dBgZWWFjY0Njo6OuLi44OnpSUJCAhKJBJVKRWxsLEOHDuXhhx/mk08+wc/Pr9p+8Aq51GCDgMISJdZyGeHejpyKyzJ4bnVO+KaGMC6ZhilyADUQk1Eg5AAmIgpKQbUYmpno27cvS5cutfhisri4mNOnTzNt2jTOnj2r3R4WFkYLb0eLdr8bYsaAFrjbWzP/x5MglYHE9CVfc5UFVHbBg2lO+M/3XWd4e1+2PN2DLw9FY6+Q8Uy/MC4l5vDDf+VtGg2F4/fs2ZMzZ86wcuVKg0vgVeHm5kbv3r1Ncr8XFhZy+fJlbf5nTEwM8fHxJCcnk5GRQXZ2NlFRUVy+fFmnf7ymEP3hhx/44YcfaNW+E4Uj3oEqGihEpubTKdAFqQQ0L6OVTEKnQBcA7etojMpOeKVSyR9//MHy5cs5d+4cERERTeK7rjrjUoi7HS8PDueuEFdcbBUkZBXy65l41hyI1NHcVsQcjUtCDnB7sLxfNEGNqThDKZVKef/995kzZ44w5ADPPvssGzdu1LYehPIlwMqvjSW63w1RWFjIR8+NIf76De555Quu50ktXhZQ2QUPpjnhE7OLeHTNEd4Y0Ya594VTqlSz93IKi36/qNVPGnPBy+VyXnjhhdv3pABbW1s6d+5M586dqz22d+/eHD6sa06SSqX4+PgQ3rU3p6vpxvXN0RgWPdiexWM7sPqfSKQSmDmghTZeycaqaj2zGohOz8dDVsT69etZuXIl8fHx2s+1sdnWxkZVxiVfZxt+fb4PuUWlfHUkhqyCEroEufLS4HDa+zvz9Nf/GTzP3IxLQg5w+xAFpQCgyhk0TRsqe3t7/v77b7p169aQQ21U7Ny5E9A3LAldqT7nz59n7NixXL1a/mW+9rEOlNl5WLwsoLILHjDJCQ9wLSWPx7/81+C+puKCB0hKStL+d+fOnZk+fTrjxo3D0dHRpH7wm/+NxdfFlmf6hvFQ1/Kg/TM3svjinwhm3tuCghLj4fMa7hkwkPSrukWVWq1GJpOxd+9eQkNDadasWb2YkGpDZGQk169fZ/DgwQa/X6ozLj3Y2R9nWyseWn2Yayl5AGw5HodUKmFslwCcbOTkFOm/TuZkXBJygNuLKCgtmKqyySRAkJsdA8K92HviIk5OTkRERODh4dFQw22UPPbYYyxbtkxvye7PP//kueeea8CRNR52797N559/zh9//KEjn7CysiJUyAIAy3bBAzz00EPk5eXxzDPP0LFjR519pjrhl+66wpp/Imjp7UhuURlXknN55WZ2qbHYoIoUFxo+RqlU8sADD+hsk8vlKBQK7OzstH3gXV1d8fT0xNvbW2tICg4OplmzZnh7e9d5Ree9995j/fr1DBgwgM8//5zWrXVbt1ZnXHK8+VlKq9TWMyWnCKVKTamy6lWCpm5cqkoOsPShDtobEUN0f38PyTn6TQTMUQ5QFyzj21qgQ03FyMp2j9Or72QKpeJDUxmFQoFUKtUpKAW3KCkp4cknnyQ+Pl5vX+WsQ0uWBViyCx7gww8/NLqvJk74nKIyTsRkav/u3dyDhKxCIlLzqjxPAiRePcuOX39i1qxZpKamaj/TAQEBzJs3jxs3bpCUlERKSgrp6elkZWWRk5NDZmYmiYmJlJaWVvk9IJVKtYYkOzs7nJyccHFx0UYy+fj4EBAQoHXGN2vWTEe3qekJf+DAAdq3b8/s2bN58803tfmI1RmXjkZlML0/LB7bgWV7rpFZUELXIFcm9Ahm4+EoCkuN62mrMi6dOXOGgoICevbsWdVL3OBUJQf49t9YDl5P19kmkcCi0e24kVlosJgE85MD1BVRUFoYtRUjX81GiJENoFartRpTqVSKjY0NjzzyCB988EEDj6xxkJiYqM0xrUxVPbAtEeGCN0xtnfD3t/elU6AL7+64SHUSyCB3OxxsrHj00UcZMWIEb7/9NsuWLaOsrIywsDCef/55kx5TpVKRlJREZGQk0dHRxMXFkZCQQHJyMqmpqWRmZpKdnU1eXh5xcXFERERU+znQzIZqurdojl+6dCmff/4548eP58mnnyW2mtdn/9VUlu66wvP9mzO4jY92+/K91/hod/XvuYrGJbVazd69e3n//ff566+/CAoKIiYmptpr3C4OHDhA69atja6gVScHOBmbxcnYLJ1tdwW7YqeQ88tp/ZthDeYkB6gPREFpQQgxcv2TlnbrS6pjx478+OOPhIWFNeCIGhfBwcEMGjSIXbt26e376KOPWLZsWQOMqvGi44KXSMud8CZiri54MOyEr8jdIW68MLAFB66lkllQSudAFx7uGsC+Kyl8eTi6ymtXdsI7ODiwePFipkyZwiuvvGKwnaYxpFIpfn5++Pn50adPH5PPKygoICoqiqioKGJjY3V6wWtmQ69fv653XmFhIRs2bODr7X/jN2V5tY9zI7OQf6PT+eN8EpkFpdwb7sXz/ZuTmlfMV0eqLgjVQERKDpcO7+a9997j7Nmz2uYWDakZz83N5Z577sHOzo7XXnuNF198ETs73Zn56uQAhhjVyR+VSs1vpxOqPM4c5AD1hUTdVOxrgjqx9XhsvS6nfTimvdn9aBmjKm1fWFgYUVFRTJ48mTVr1qBQKBp4tI2P+++/nx079NsoXrhwgTZt2jTAiBovsbGxDBgwgNj0fDpMfZ90Ky+TXfDmnJF3LTmXwZ/8Y3R/kJsd745qR1s/Jxys5cRlFvJ/J2+w7mBkldpADXtm92v0M0yurq5kZWVpJTaOjo48+uijjBw5kjxrD+b/nVHl+Q908GXx2I4M+GgfSTlF2u1LxnZgRAdfen24VycY3hBJX71ssIWnXC4nLCwMhUKBtbU1NjY22NjYYGtri62tLXZ2dtjb22s1pw4ODjg6OuLg4ICTkxNOTk44Ozvj7OyMi4sLTk5OJmtOk5KStM03JBIJHh4eLFq0iCeffFIrq7lnyd81muGWSyX8+9ogIlLzePiLI9UeH+xux/45A0y+vrkiZigtAI0YuUOAM2O7BNAzzJ0AV1syC0o5FZvJR7uvElVJtN7M04E372/NXcFulCpV7L2Swrs7LpGRX77sYu5iZFMMSz1DnEgtkfPggw+ycePGBhpp46egQPeL/KmnnuLee+8VxWQF1Go169at48UXX9S+Xh8/EIZfqy4W74IHw074isRmFBh1u1dFU3HCq9Vq7fuiY8eOzJw5k0cffVQ7E3chIRv+PljlNSb2COZCQrZOMQmw51IyD98VSFtfJw5FpBs5uxxXZ0eSDEzYqVQq4uPjUSqVqFQq7f/Wx3yVVCrV/pPJZMhkMuRyOVZWVlhZWenMjqrValJTU3nmmWd48cUXGTVqFAOHDic2w7VGj9mvpSdu9go+3m18ubsilXNMLRXLfvYWgkaM/Gy/ZtwV7MqO84lcTszF09GayT2D2T6jDw+uOsTV5HLhuo+TDd8/04Pc4jKW7LqCnULGM33DaOXtyKiVhyhVqs1WjFwTw9KNzALcJy1DEexMXEaB2RbXplDVLO65c+Uz405OTvz4448mdWSxJNauXcvKlSs5ffq0znYXFxcRjl8BS3bCSyQSvv/+e/z9/bnrrrv09ptiXPJwsCanUH8GUi6T6vyv0TEA108dIfLqJV555RV27typbeHZo0cPDh06ZPTc0tJSsrOztf9ycnJ0/uXl5ZGfn6/9V1BQQEFBAYWFhRQWFlJUVERRURHFxcWUlJRQXFxMaWmp9r8NUVBQwJYtW9h28BTuE5ZW+dwqM6qjHyVlKrafM6z/rowmx9RSTYUaLOfbyEKpKEZedzCKWd+d0lkC2n42gZ2z+jH9nubM/v40AM8PaI6dQs4DKw6ScLOl25m4LDZP7cFDXQLYcjzOLMXINTYs3dx9PC7HIg1Lpszi9g5zJU/mgJNTCdeuXcPLy8vY5SySpKQkpk2bZnAmx8nJSedvS3bBg3DCjxo1yug+U4xLUWn59G3hQaiHvc6K1MiOfihVai4l5hg9F2618Gzfvj1//vkn+/bt4+WXX+bkyZM4ODhUea6VlRUeHh63JXbu1KlTdOnSBUCnwJ0/fz73338/p29kM6aaHNOK2ClkDG7jzT/XUquVAFSkxEDrT0tDFJRmTkUx8snYTL390ekFXE3Jo7nXrS+E+9r68NflZG0xCXAoIp2I1DxGdPBjy/E4wLzEyMKwZDo1mcWNy8jH+8kV3BVgT7G86h8dS8TNzQ2pVGqwBWLlglJQyQmvVpdnu9QSc3LCQ/XGpTX/RNK/pSffP9OTr45Gk1lQysBWXgwI92LLv7Gk5Bqe6QPDLTz79+/PiRMn2LZtm1bD2BBo3O8AI0aMYO7cuTpGKmsTc0w1DGnjg51Czq9VuLsNYWpeqjkjXgEzp7psMgAPBwWZN7WR3k7WeDpacy4+W++4MzeyaOt360dOk01miOLiYoOuxMZIfXdP+O54bL1cqzGy9Xgsg5bt53BkudaquveW6mbLvFMJBQxatp+tZvza1AYrKyuj2YXG4pYsGbVaTfyuDaT/sRyZRI1MWrOCUiaVYC2X8uGY9jw/oPltGmXDMKF7UJWfx3+jMxi7+jDnE7KZ1D2YN0e0IcjNjsU7L/O/X89XeW1jLTwlEgkjR45s0O5pnTt3ZsmSJVy6dIlff/1Vz5WvkQOYyuhOfuQVl7H7UrLJ50huPo6lI2YozZi84rJqs8lGd/LH19mWj2/mkGl63xq6W03JKcbVToFCJtX2Cq4sRo6NjeWLL75g9erVZGVlkZ6ejouLSz0+q/pFY1iyU8iY1i+MToEudAxwwcVOwZwfzvDjyRt65zzeM5jHe4QQ6GZLZn4p288l8NGuq9pgYHM1LIlZ3PonPz/f4HK3po+14BYHDx5k9uzZnDhxAolEwq6d37Fg++UqZ8o1mHs/eKjeuARw5kY2T248XqPrNnbjkkKhYM6cOUb31yTH1M1eQe/mHvx2JoGiUtOXsDVyAEtHzFCaMTHp+VWKtJt52vP2qLb8F5PJ/90snGysyt8ShvQgxTe3aY6B8qXNqNQ8du/ezciRIwkJCeHDDz8kIyMDlUrV6GN0NIYlNzsFswa2pJmnA5cSc40eP+++Vrw9sh1XknN5e9tF/riQyOSeIXwxsav2GI1hyZwQs7i3h5ycW7o1iUSCTCbj9ddf5+rVq6LN6U3OnTvHiBEj6Nu3LydOnACgQ4cONPN25uunurP7xX5M6h5MsLud3kyUhPJIl0ndg9kzux9fP9XdLItJDe892B55DWdtq6OpGJeqYkC4l0mz2fd38MVKJq3RcrchOYClIkpqM6YqkbCngzUbJncjt6iM6Zv/Q3NDq7krM6QH0WhRKt+5devRk6L4y9q/NXowiUTC008/jbe3t05bsZCQEPz8/Orc27Y6PvvsM9asWcPixYsZPny43v6KhqWU3GK6LdpDal4x7f2d2TZDP5TY09Gap/qE8n8nb/DyD2e026PS8nl7ZDsGtvLir8spZmdYqs0s7oj2vkztE0ozTweUajVXk3JZ/U8kf18pl0iY6yyuIapyZ6empmqPa9OmDZs3b9brZW3JPPnkk2zatEkboA3l3yt9+/bV/i2c8LewdOOSMSZ0D2LjkehqjxvdyZ/U3GIOVtFVpzLG5ACWiOV80iwQYyJhR2s5G5/shpOtFQ9/cURneTslt9yI4+VorXeel5M1mQUl2uVuDcEB/lypUFBqUKvVfPvtt0bHJ5FIkMvlWFtbY2tri729PU5OTri6uuLm5qbtb+vn50dgYKC2x23lLgjG+Pfff7lw4QIjRoxg+PDhfPbZZzRr1ky7v6JhqUSpIjXPuCgdoEuQK1YyKdvO6gaxbTuTwNsj2/FARz/+ulxeMJmTYUkzi+vpYM2sgS25kVnApcRcejZzN3j85J4hLBzZlr8uJ/Pjn5extpLyUJcAvnyiG9O++Y+dF5LMNnZKgykO+AHhXmSe+B2A0aNH89133zX6Gf07yfHjx7X5rpXbE4aHhxs8x9Kd8CBaeBrCFDkAUCM3ODR+OcCdRhSUZoyhbDJruZR1k+8i1MOeieuPcT0lT+ec5Jxi0m7O0lWmY4ALFxN0oyUkwH/7/yQxLppZs2bx+++/azs5NG/enEuXLhEfH09MTIxOS7HU1FTS0tLIyMjQ5pBlZmaSmJhIaWmpUaOCBplMhkKhwMbGBjs7OxwdHXF2dsbNzQ0PDw+8vb3577//tMfv3LmTVq1a8corr/D6669jb29vkmGpIpoZ2uJKM7Qa7WT7Cj9kGsPSAm4VlCqVit9//50PP/wQKO8/29ip6SwuwORewZyOy+KpTSe0274/cYOj8wfyUBd/dl5IMrtZXA01ccCXO3I70OnFdXz2xnhRTFbi7NmzQPmNZ0WdqVqtplWrVg01rCbBjAEt8HCw1sag1eR7zlxbeFpyjumdQhSUZkxlMbJUAivGd6ZLkCtPf32Ck7FZBs/783wSY7sE4OtsQ+LN6KBezdxp5unAhoNROsdqxMjNmzdnx44d/P777zz//PNER0fj4eGBXC4nODiY4ODgGo8/IyOD6OhoYmNjiYuLIzExkaSkJNLS0khPT9cG5BYUFJCZmUlJSQlKpdKgyUGzDP/+++/zwQcf0LVHb1LvmQs18P9FpJYX312DXTkSeaujxN0hbgB4O9voHK8xLMlR8u233/LBBx9w9Wr5rIGnp2eNXovbgVqtZsKECbRt25bZs2cbnPmt6SwulM+AV+68lFdcRkFxmY5cwpxmcaEWOaY39+fY+lhkjml1XL58GSsrK0pL9bMARUFZPeO6BdG7mUe1NzgaZJLybN1g6yI2zbivyS9zV0bIAW4/oqA0cypmk/1vRBsGt/Fh98VkXGwVjO7kr3PsLzeFyJ/vu87w9r5seboHXx6Kxl4h45l+YVxKzOGH/27p5QyJkYcPH87ly5dZuXIlgYGBdRq7m5sbbm5u2tBaUykpKSE2Npa+ffuSlJSks08qleLt7Y1/eEdSaxQmARcScjgVm8mz9zQjOaeIIxHpNPdy4N3R7SgpU2FTSWKgBvqNGMuFgzv1ujmUlZXx7bff6vSv1cyw2tnZ6bQTu10UFRWxZcsWoFxvumjRIp544glt/1swLXaqMkcjMxjWzofJPUP461Iy1lZSJvcMwdHGii8P37ohMTSL21SpkwNeDcoylXDAV+LixYsGi0l/f3/8/f0NnCGoTKCbHV8/1f2WBKOaFp6fvzSOvyPOc7rzbwQ+8EBDDfu2IeQAtxeJuj6abQoaLdeScxn8yT8AbH26Bz3CDOveAELm79D+dwsvB94Y0Ya7QlwpVarZezmFRb9fJC2vROecPbP7NdolS1dXV7KysgBo3rw5L7zwAo8//jjOzs6cis3kQSN6Gc1yriHDibeTNSvGd6HbzVnJMqWKdQej6BHmRpiHAx3e3qVzfOKmlyhJrN2Xl0Qi0elhK5fLdXrYKhQKrK2tsba2xsbGRrv8b2tri52dHfb29jg4OGj/OTk54eTkhLOzM05OTkgkEvr00V22btmyJUuXLuX+++8nv0RJ+wU7DSYFVPUaudsr+HRcZ/o0v+VSTs8rNjgrLgHOLxiqY5xIT09ny5YttGvXjv79+9fqtbuTbD0eW6+zHh+OaS9+qICAgADi48tvcjUympEjR7Js2TLCwsIaeHRNl6qMSwMGDGDfvn0AvPrqq7z77rtYWVk14GhvDxVXE4QcoP4QM5RmTkUx8ri1R00+71pKHo9/+a/R/U1BjNy1a1ccHR2ZOXMmAwYM0Jn1q21Xg+ScYh7+4ggh7nZ4OloTnVZAal4xx+YPJLLSMi/A33/t5vsvPmbFihWo1WqtNjQ0NJS3335b28s2NzdX289W08e2Yi/b4uJibR9bTf/a/Px8ysrKKCsrQ6VSaZf763KPePXqVUaOHIlCoaBN7yGouz9b42sUliqJTM0jKbuQvy6n4GAtZ0rvUFZP6MrDa44Qk34rD07TA7eNrxMHDx5k9erV/PDDD5SWlvLQQw81+oKypg746PdHGL3WgWupTNrwr0U44KtzYxcXF2uLSYCePXuyZMkSevbs2RDDNSuqMi61atVKW1AuWbKE/fv38/333xMUZF7FU03lAKhVIJGadY5pfSAKSgvgvQfbM/DjfShRUxPNYFU0BTHynj17jO4zZFiqCdHpBUTfLIyaezng7WTDj//pFg8SoGOYH70++YRZs2bx2muvsXXrVgB8fHyYOHFiLR+9elQqFTk5OWRlZZGZmUl2drb2n6aAjYuLY9WqVXrnWllZ0alTJ1p37sq+Wjz2yse6UKZSM/WrW6acXReT2TenP68MCWfGllM6x89++RXO7dtGUlKSthevTCbD3d34bHpjoaYO+Be/O623rUOAM1N6h3LgWrn5yVwd8KY63yd0D2L/tu+A8vaT3333HUOHDr0jMhBLR5OFqrk5/e+//2jbti0rV65k0qRJDT28esVUOYC8KIv08//wZN/mfPTUKw013CaBKCjNnOTkZN554w3STibgNHh6vV23qYuRa9I9oSokEpg/rBUFJWVsPhajs69i94TQ0FC2bNnCnDlzeO2117jrrrvq9LjVIZVKcXFxwcXFhZCQEIPHnD9/nlWrVmmXE9u2bcv8+fN55JFHsLKy4kJCNvuWH6zR4wa62tI/3It5P53V2Z5dWMqJ6Ay6BrvqnbNv7x5KU8q1rhrzlFKp5Msvv+TXX3/Vaku9vLzw9fUlICCAkJAQmjdvTnh4+G3rxDRv3jzi4uJYvHixQc1ebRzwvxgITO4R5oZKpea3M+VxVObmgK+p833jkWhUCRl0v3c4h3b9ppNBKbi9aGQ2ms9hWVkZeXl5vPjii2ZXUGqoLsd03pzZrNizho/3QKibLTNmzGjoITdaREFpZqhUKk6dOsX27dv59ddfOXWqfDZIJpMx/+33+fxA3TuUmIsYuaJhCcpbKjrZWOHtVO7WHtjaC5+bzu1Nh6PJLS7jrfvbYC2XcjExB7lMyqiOfnQMcOHlH8+QcNMRD8a7J3Tt2pWdO3fegWdXPU5OTkilUvr378+8efMYNGiQzixQbWZxPW/ml8oMzCbJZVK9Lh4SYMYTj7J6+acUFRXpLNc7OjqiVCqJi4vj+vXr2h85Q2jyTCtmmXp6emoL0ODgYJo1a0bLli3x8vIyKVT/xx9/JCIigp9//pl3332XmTNn6ujJauOAr4xCJmVYO1+ORWWQlKP7/jEHB3xtne9yvzZkBrXjh5Pxwvl+B5FIJAY/Z87OlpHtaUgOkJ9/S8o0c+ZMcnNzmT9//p0eWpNAFJRmxPHjxxkxYgSpqanaZQsNb731Fq8Mb0+gp7MQI9+kcveEZ/qGEeB6a9Z1WDtfhrXzBeCXU/HkFpdxISGHKb1DGNXJH5VazZkb2UxYf0wnRgiaRveEoKAgCgsLjeYf1mYWNzq9AKVKzf0d/Nj8762bFx8nG7qFuHEiOkN3DO52fDznfV5/dQ7z589n3bp12hmS5cuXM378eJ3j09LSuHLlChEREURHR+vkmmoyTZOSkoiOjtYLw66IJsfUzs5OW4B6eHjg4+ODv78/wcHB2oSAwsJC5syZw9q1a1mzZo22S0ttHPCVGRDuibOtld7MpTk44OvifFchobhM9H6/0yQkJFSbAWxpREdH6/z92muvsWnTJo4ePXrbVkeaKqKgNCOcnJzIz8/Xu8uUyWRMmzYNqEU22c395ihGrtw9oc/iv6s958eTNwy2GqxIUzAsaaguTLums7gZ+SV8fyKO8XcH8e3U7vx5IQkHhZyJPYKxkUtZuS9Ce+2Ks7ju7u6sWbOGp556iqeffppz584ZXGb28PDAw8OD3r17m/T8cnJyuHr1KhEREURFRWnzTFNSUrRZpunp6cTHx1NaWmrU0KRWq7l8+TL9+vXD09OThx+bRKztvSaNoSpGdfKnuFTJH+cT9fZpckw1sgm1Ws3BgwdZs2YNnTt35qWXXqrz498u6rv3u6eDtdncyDZmnnvuOfbu3Utubq5OYWnJYTCRkZF6265cucKqVavETGUlRGyQmbF//34GDBig/QKQyWQMGzaMbdu26R1rajbZxB5BTaI4qg1xGQUMWraf4ir6ntcUa7mUPbPvMYviu2LsFMDBVwfozOJWpM+He7mRVYhMKmFC9yAevSuQYHd7AM7eyGL53ut6M7mGYqeUSiXHjh2jZ8+ed9yIUVRUxPXr1zlx4gRPPvmkwWOcnJwI7tSbnF7PG9xfVaRSRRys5Zx4fRD7rqTy7Ob/DB6zY2Yf/GxVfP3116xYsYJr164BMGzYMH7//fcaPrs7g+YzJZNKTO79LpHAhLuDeOzuIMI8HSgsVXIpMYd3tl/kUlKuWX2mGjupqalMmDCB3bt3a7cFBgYSG1t3uVRT4+zZs3Ts2NHgvitXrtCyZcs7PKLGjZihNCNUKhULFizQuZtUKpVGfxirEyNXjPEwV0T3hKqpzSyuUqXmqyMxfHUkxugxVc3iymQyevXqVadx1xYbGxvatWun1VhqDEuBgYE899xzPPHEE/j4+FSZY2oqw9r5YGMlM2jU0TB0+AgSzh7W+UxLpdIGc8CfO3cOV1dXAgICjB5TU+c7wJKxHRjVyZ+fTsaz6UgMdgoZbf2ccHewBnLN1vneGPH09OTPP/9kyZIlzJ8/H7VaTXp6evUnmiGOjoYnUhwcHEQxaQDzrxgshLKyMrp168bp06cZOnQokyZNYuLEiTg7O3P//fdXe35V2WTmjuieUDWW2ANXEwQ/cOBAnn32WQYNGqRj5KltjmlFRnXyJ6ewlL2XU4wek5KYoLfcqFKp+Oabb9i8eTNWVlbY2Nhox6txw/v4+GjNSKGhobRs2bJe2n3ed999ZGRk8NZbb/HSSy/pSSZq43wf0d6Xh7oGMu3rE+y8mGzwGHNzvjd2pFIpc+fOpW/fvvTt21ebhWttXW66s5QJiNDQULZt28YLL7xATEyMVgYgOjUZxvzeARZIUVER7dq1IyIigscee4zNmzcDt/Rx1enkBDBjQAs8HKyFYckAljiLGxQURHZ2ttH9dc0x9XS0pmeYOz/+d4MSpWG5hQQ4sus3Zj3/LIcOHbq1XSKhY8eOeHh4kJ6eTlZWFjk5OcTGxnLt2rUq3fAVzUgODg64urri7u6Ol5cXfn5+BAYGEhISQrNmzWjevDk2Nrf606vValJSUigrK+O1115j3bp1fPHFFwwcOFB7TG2c71P7hHI6LpOdF5ORSMBGLqOwVP85mIvzvSnRq1cv9u/fT79+/fh04/cU+HYxKUe0hbf5FP33338/3bt359577+X8+fMAVc7QWzKioGxiqNVq5s6dy/Dhw+nfvz9ZWVm0bt2apKQkZsyYwfLly7XHPvzwww040qaHMCwZR8zi6lLXHNORHfyQSSVVLncHudvRtWM7Dhw4wNatW5k1axbp6emoVCqef/55pk6davTctLQ0rl+/TkREBLGxsVo3fEpKijboPisri6SkJEpKSoyaLiQSCXK5HBsbG2xtbbXOebVaTWRkJIMGDeKuu+5i0aJF9OzZs8bOdwdrOR0DXPj6WAyvDAlncq8QHKzlxGYU8OGfl9lx7pZZyRyc702R4DZduOetH1gZbYMsNsakHNG+zT3M6jvR09OTAwcO0KNHD65cuUJKivFVBUtGmHKaGMeOHaNHjx7Y2Njw3XffMXnyZLKysnjrrbdYsGBBQw/PbKjKsARqgt3tzd6wZAjRA/cWC367YNQBP6lHMH+cT+RCQg5wK8dUw2/P98bL0YaeH/6FoW9gmVTCpO7BOrNxOTk5vPXWWyxfvpz9+/eb7HQ3hbKyMu0MZ3R0NLGxscTHx5OcnExaWhqZmZlkZmaSkZFh9BpyGwf8X9xqcJ8xo1JbXyd2vNCXjPwSlCoVn/51jZyiMqb0DqGDvwtPbjrO/qup2uMN9X4X3D7q+nlfOLKtWeWI5uXl4e3tTXBwMBcvXrSYpX9TEQVlE2P69OmsW7dO2xoLYPny5SK9/zaSV1TKf1djOXDoCG8veBNHinhkzCjy8/NZvny5xYT+ajCl84kGzX5zm7GA2jngAcI87Nn7cn/WHohk0e+XjF7fkAMeoLS0VCdg/U5x9OhRbS9tjVnJ0dGRAQMGMGLECMocfVh81nBXG2MFZbcQV36YVm7AGr3yEKfjsgCwU8g48MoAItPyefiLIzrX2jGzj8Xqve8kdckRrcicIS3NKkf0vc+/5NMd/xE+YCxxFrT0bwqWW0o3Empyh1NUVMTmzZt1ApsdHBwYNmzYnRquRfLx4vd56623tH9nAKtXr0YikfDhhx9aXEFpag9cc4+dqo0DHiAyLZ+Q+TuM7q8ux7QhiklAZ3ayV69ePPfcc4wZM0Zr1DgVmwlna+Z8Lyot14/GZhRoi0mAghIlf11OYXQnf72blpJ6jPgSGEbkiOqjvZG+4YVDp2HEGpC7mPvSf3WIgrIB0P4Q11DcvG3bNnJzc3WulZ+fz4ABA7hy5Qq2trZ35glYGP369TO4vUePHvj6+t7h0TQeKsdORaXm0fXu7tzTpzc/f70GWyupSS0OmzKW5IDv3bs3ixcv5v7776d169Z6+2vjfE++2W4yzYB5Jz2vGIVcip2VTEcuUB8Oe4Fx4jIKeOu3C0D5TLEpWaJLH+rAQ10D9a4VkZLHwGX7efO3C/Rq5tFkCyu9FqLVfNw13weHI9MZtGy/2S39G0MUlHcQU5YKq7rDee+997THaZacAJo1a0ZpaakoKG8T/fv3Z9SoUfz6668624VapJxDhw6xcuVKLl++TEniVXb/cBX3375FrVZz6tQp2rRp09BDvG1YkgPe2dmZV155xej+2jjfU3KLSckp0nZeqoiXkw1FpUrySm4Vk5KbjyO4fWhyRAHc7BQmZ4kWlyqZW+lzkFtUCtCkc0TrsvSvvKk9tZQWoqKgvEPo3eFUM6NR+Q7n4TA1p0+fBsDe3p6RI0fywAMPMHToUNzc3G7r2AXlLf8qc/ToUbZv325Szqc5c+zYMb799ludbcXFxdjY2FhEvIZwwJdTW+f79nOJTOkdSp/mHhy8mWHpamfF4DbeHI5I1zEtBbnbWbTp4XZTMUcUTM8ShfKi0VhqQVPNERVL/zVDfDLvAPVxh/PNVQgYOpVPnxnGyJEjkcvF/3V3itLSUn788UeD+77++muLLyinT5/ORx99REJCgs724cOH4+Tk1ECjurOIHNNyatr7Pbe4jJX7rjOivS+rJnRh/cEocovKeKx7EFZSKUt2XtZeu2Lvd8HtoWKOKGBylqgGqQTsFHLyKkgUNDS1HNHaLP1XRC6V8McLfWnh7cii3y+x9kBkk1/6rw4hRrnN1OcdjqzzaEoD7xLF5B1GKpXSrVs3hgwZou028uijj3Lo0CE2bNjQwKNreGxtbbn33nv1tkdERFiULGBctyD2zL6HXmHly4IyadV9yDX7e4W5s2f2PU2+mASY0D1Ip5h+pm8Yc4aEM6lHMADD2vkyZ0g4c4aE42xbbi5KyyvhodWHOXQ9nSl9QpkzJJyk7CIeXXuES0m3NONKlZqJPZr+a9SYqWmOaEVsrWScXzCU8wuGcvqNwbw9si12iluuf02OaGUyMzNZvHgx99xzD6mpqXr7GwpDS//NPB24lJhbzZnlTO4Vgp+LrgxNs/RvrojK5DYSl1HAj//dYOHItvQMcyfA1ZbMglJOxWby0e6rRKXla4+Nfn+E0escuJbKpA3/Apj9HU5jRCaTsXv3bqB8mbtXvwHcN34qtgGtic4uI0ReZtHLcEqlkr179+ptP3PmDN999x3jxo1rgFE1DJbugK+t8z0us5BnN/9ndH91zndB3ckrLjPoXDaFlNxivvgngvMJOUglcE9LTx7vGUJrXyfGrT2qLVJj0wvILy7/vrx27RqffPIJGzZsoKio3JwVGxtbLy1Cq6OsrIz169czatQofHx89PbXZekfwN1ewax7W7D6nwheHhyu3d5Ul/5NxXJ/Be8Ar/18jqf6hNI1yJUd5xO5nJiLp6M1k3sGs31GHx5cdYiryXkAvPjdab3zOwQ4M6V3KAeu3XpjN2Vxc1NGUyD8dbmAwJd+YMHRYjhaHpFi6dlj58+f11vulkgkuLq6kp+fb+Qs86ayAz46PZ9Zs1/mn317Ob73dzq2bdXQQ7xtWJLz3ZyISc+vdSvRxTuv6Py97WwikWn5vDq0FcPb+bDtbHnHIzXw/LwFHNy2lYiICB1zKZR/b9wJ/v33X5599llmz57N66+/zksvvaRjaq3r0v/c+1oRmZbHz6fidQpKaHpL/zVBFJS3Cc0dTn6JkhfiT1FaIWdg+9kEds7qx/R7mjP7+9MABsXMPcLcUKnU/Hbm1o+1ud/hNDYMOfMrf+lZevZY+/bt+eeff1AoFEyZMoWLFy+Sk5ODg4NDQw+tUZCZmsT1//7j5O6fKM3M5N5+vWnevDmtWrVi06ZNDT28eseSnO/mRH3ne64/GMXLg8Pp3dxDW1ACbPnuB0oSIwB0ikmArl27AuWFpVQqRSaTYWVlhUKhwNraWtsCVNOL3tHREScnJ1xcXHBxccHNzQ03Nzc8PDzw9PTE29sbb29v7Ox03zs5OeUdrAoLC3njjTf4/PPPWbx4MY899hhSqbROS/8dA5wZ2yWAh784bDDywJxbiIqC8jahucM5GZupty86vYCrKXk09zL+g6uQSRnWzpdjURkk3cxq02DOdziNibo68y0le0wqldK3b18AXnp1PtNffZNzCbk4OSgtvhUZwL333su1a9e0f2dkZPDvv/+atRZaON+bHvWd71lcpiKzoAQXW4XO9t07/2DrqqWsXbsWlUqlU1Q+8cQTFBYWkpOTQ25uLvn5+RQUFFBYWEhRURGZmZmkpKRQWlqKUqnUK0irQlOkyuVynUkBtVpNYmIikyZNYvr06Tw64XFiXIdRvvZUcxaObMv2swmcjM0iwMVwlF/FpX9zwryeTSOiujscDwcF124udxtiQLgnzrZWBmcuzfkOp7EgssdMRzeo3xW/KcsZ/+VJQMgBAJ577jlmz56tt33MmDENMJo7h3C+Ny1qkyNaFfYKGW52CjLyby0VS4CuLYPot3Il8+fPZ/78+WzevBmJRIJarWbdunXIZIbbdxpDpVKRmZlJcnIyKSkppKWlkZaWRkZGBpmZmWRlZZGdnU1OTg55eXnk5+eTmJio1W1WJC8vj2+37cbr8eG1es4Pdw0g3NuJ6ZtPVnmcGohOzze7FqKioLwNVCduHt3JH19nWz7ebbxgGdXJn+JSJX+cTzS431zvcBoDInvMNOoa1G8pzJgxg3nz5lFcrKvB2rdvHy+//HIDjerOMK5bEL2bedS493uvMHeLe580NLXNEbWWS5FLJeSXKHW2z7y3BVKphP1Xbzm3K+aIBgYG8s033/Diiy8ya9Ysbty4UeNiEspXSNzd3XF3dze5icLy5cuZNWsWarVaO2s5efJkXnzxRYodfHlwVc1aiAI4WMt5dWg4aw5EkJitX6xWxhxbiIpq5DZQlbi5mac9b49qy38xmfyfkQwrB2s597by4u8rqeQU6ed5gfne4TQ0muyxDjd1MNW58wEkEphwdxCP3R1EmKcDhaVKLiXm8M72i1xKyjVLZ76QA5jOmTNn9IpJgO3bt3PgwAGtXMBcMcX5rlarIS+ViUO6MalHsNCHNxCVc0Sh+ixRZ1srdrzQl9/OJBCRWr7q1q+FJ/e28mLflRR2XUoGjOeI3nXXXRw6dOh2PzUdSkpKUKvVeHp6MmvWLKZNm6ZtXnEhIbtW13y6bxhWMinbziZql7o1r5OzrRUBLrYk5xZp/RTm2EJUFJS3AWN3Hp4O1myY3I3cojKmb/4PY7/Bw9r5YGMlM9p1oLrHEdQeTfbYs/2acVdw9e58gCVjOzCqkz8/nYxn05EY7BQy2vo54e5gDeSanTNfyAFqxsmT+stfPXv2pHfv3oSHhxs4wzwx5HwvKVMhl0KnZv6oSgrB/U0OZzXjRlAQ/fv3b+ghWxwTugex8Ui0zrZn+oYR4HrrZnhYO1+GtfMF4JdT8eQUlfLX5WT6NPdgbBd/ZBIJ0ekFLP7zMmsORGo7HTWmHNHHH3+cli1bMnToUBQKXY1nbZf+/V1scLFTsGf2PXr7ZgxozowBzRn+2QEuJuaYbQtRUVDeBgzdeThay9n4ZDecbK14+IsjpOQajyAY1cmfnMJS9l7WD4Gt7nEEtadi9ti6g1HM+q56d/6I9r481DWQaV+fYOfFZIPXNSdnvpAD1JypU6dy33334ebmhru7O8XFxezfvx8rK6uGHlqDYW8tp62fM4mJieXmjJJCAN5++20A+vfvLwrKBqByjihgUpboS9+fqXJ/Y8sR9fT05IEHHjC4r7ZL/18ejmZXpd8Ad3sF74/pwA8n4th9KZm4m9c01xai5veMGgGV73Cs5VLWTb6LUA97Jq4/xvUU42YcT0dreoa58+N/NyhRGp+BNNc7nIakYvaYqe78qX1COR2Xyc6LyUgkYCOXUViq1DvXHJz5NZUDLH2oAw91DdS7TkRKHgOX7QcsI6hfIpEQGFj+OjzzzDNs3LyFq6kFlJSpUMilFu2EHzhwIJcuXdLbrnm9BHeeWzmiKmrrdK5MU8sRrc3S/4WEHC4k5OhcR7P0fTUlT1tsmnMLUcv8FrvNVLzDkUpgxfjOdAly5emvT3AyNqvKc0d28EMmlVS73G2udzgNiSnZYxXd+Q7WcjoGuPD1sRheGRLO5F4hOFjLic0o4MM/L7Pj3C1DVVXO/GvXrnHt2jWGD6+ds/BOURs5QHGpkrmV8ghzi0q1/21ucgBjaPSDRz2H4fb0EEYsP6jdZ8lO+Ndff52JEyfqbd+2bRsJCQn4+fk1wKgsG2d5Ga6Re0gK0m+nWluaWo5obZb+cw30LzdEY1r6r29ERXKb0NzhvD68NYPb+LD7YjIutgpGd/LXOa5y4Tiqkx9J2UUcjUo3em1zvsNpKExpO1bZnR/sZodUKuGBDn4oVSo++OMSOUVlTOkdwvJxnckrLtNxOFZ25h8+fJjFixfz22+/AVBcXNxgy6BlZWUkJyfj7+9vcH9t5ABQXjBWdXNkTnIAQxh0wotgfC0TJkzg+eefJztb1wiRlZXF559/zqJFixpoZJZFbm4u27ZtY+vWrWzfvh21Wk2XSTak+/eq87WbYo5obZf+K3Mjq5CQ+Tu0fze2pf/6RojwbhMTugehVKlp4+sEwOA23nzyaCe9fxUJ87CnQ4AL284maIXMhjDnO5yGorq2Y4bc+XbW5REXbvYKnv76P745FstvZxJ4bN0xMgtKmDGguc411EBkai4///wzd999N71792bHjh2o1eXddxoy6HrLli0EBATwyCOPEBERobdfIwcAOBmbqVNMQtVh/VJJ+WyuMTRyAHNj6/FYBi3bz+HI8pvDmjrhtx43v9ekMtnZ2XrFpK2tLd9++y3z589voFFZDvv27WP06NG4u7szYcIEtm3bpv0+2rv8VT4Y0x5ruVT72TcVmVSCtVzKh2Pa83yl78GmwnsPtkdew+ddHU1t6b+miBnK24TmDmfC+mMmB/pGpuXr3M0YwtzvcBqKqhzzxtz5RaXl58RmFHA6Lkt7fEGJkr8upzC6k79e7l637j0pTrjV97asrHyZRK1W06JFC532Yra2ttjb22v/OTo6av85Ozvj7Oys13LM2dkZqbTm94lJSUlIJBJ++uknfv75Z5577jnefPNN3N3dgZrLATTYWsk4v2Aodgo5WQUl/HYmgQ/+vExBhcw6cwzqF05403BycuLjjz/G09OThQsXcv36dZo1a8b48eMbemgWwYIFC9i/f7/e9mHDhuHs7My4bs4WmyMqWojWHFFQ3kZuiZvrq/eA+d/hNBTGHPNVufOTb7bETMvTd+yn5xWjkEuxs5LpaGtCggK4mni1PHevEikpKZSVlaFUKrVtxQwdZwqaNmOafrhyuRwrKyudvrjW1tbY2tpiY2NDYmK53lOpLC/0li9fzurVqxkyZAgzX3qlxnIAgJTcYr74J4LzCTlIJXBPS08e7xlCa18nxq09qvO5MBTUn5CQwIYNG9ixYwebN28mLCysVq/FnUY44U1HIpFouwgNHjwYX19fnJycdGKFLN24dDv55ptv6NOnD7GxsTrfNY8++qj2v03JEZVQrusf0NKLiT2CzGbCY1y3IKIS0/jiSCKo9eUqNaEpLv3XFPEJvY2IO5ymg6Hsserc+Sm5xaTkFGldfxXxcrKhqFRJXsmtYlIC/LfvT7LTU3jzzTfZsGEDMpmMsrIyfHx8SEhIMDg2lUpFfn4+GRkZeu3ENC3FcnNzycvL07YWKygo0OmBW1xcTFFREaWlpRQUFJCdna1TvGoKSQ1qtZqSkhK2b9/Ozn8v4DdludHXzlhY/+KdV3SO23Y2kci0fF4d2orh7XzYdvaWaUkT1N/K24E///yT1atX8/vvv2t79d64caNJFJRxGQX8+N8NFo5sa1Iovga5VMIfL/Slhbcji36/xNoDkdp9luCEB8jBjrunLyFZ4U27BTv1CxYLNS7dTgICAggJCSEmJka7TS6XM3LkSL1jjeWImmvBn5eXx8qVK3l93jzsOwzB9/4XUKqrl65UxNJaiJrXO6ARMq5bEGl5xfUyY2EJdzgNReXsMVPd+dvPJTKldyh9mntw8KZpxdXOisFtvDkcka6jhdU48+39/Fi3bh2zZ8/m1Vdf5ffff8fBQV97qEEqlWqXuoODg+vtOVdk1qxZrFy5krKyMmQyGUqlkjZt2jB+/HjCew3lld2GM1FNDevXsP5gFC8PDqd3cw+dghJg7MOPEnl8L6WlpdrevhqcnJzq/BzvBK/9fI6n+oTSNcg0F7yGyb1C8LsZMVIZc3fC6xiXnFuhNPAesmTjUn2ye/dufvvtN5YuXYq1tTXDhg1j//79dO/eneTkZKKjoxk8eDAuLi5VXkeTI2qOZGRksHz5cpYtW6bV97ZWZPB/L/W3yKX/miAKyjvAjAEt8HCw1raqq9EdjgTkMqnF3OE0JBWzx/43oo1J7vyV+64zor0vqyZ0Yf3BKHKLynisexBWUilLdl7WHm/Imd+2bVt27NjBgQMHtDNxDUVhYSFlZWVIJBJGjBjB3Llz6dWr3OF5ISEbDBSUNQnr11BcpiKzoAQXW4XevoS4WEpLyyOFKi/1d+7cGYlEgpWVFba2tjg6OuLq6oqHhwc+Pj4EBgYSEhJC8+bNCQ8PJyAgoFZa0qp48sknKS0tZenSpfj4+Ojt1zjh80uUvBBvmgseysOPZ93bgtX/RPDyYP3OOebshNdr4VnNV6Mlt/CsDxYuXMihQ4eIiIhAqVSya9cu+vbty/79+0lISGD8+PG8+OKLDT3MBkGlUjF//nw+++wzSkpKdL6Tn3zySYte+jcVibq2Ii1BjTEYIWIEmaT8y1V54zw7Fz1JmyARE3S7uZacy+BP/gFg69M96BHmbvTYiuapQFdbXh/ehl7N3bGSSjkZm8mHOy9z9oaue3XP7H6N9gvmjz/+YOfOnTz33HO0bNlSZ19+cZneEqS1XMpXU+6mvb8zE9cfqzZfVYO9Qsa5t4ay9Xgsr/1yXrtdApx7awjbf/k/ZsyYQUZGhraolEgkTJw4kaSkJFJTU8nMzCQnJ4fCwkK9L/6KyGQyFAoF9vb2ODk54ebmhpeXF35+fgQGBhIWFkaLFi0IDw+vdkYGwM3NjczMTBwcHPjggw949tlnkclk2v0LfrugF4ZckW0z+gDwwIqDOtsXj+1AS28HZmw5xcFX79Vb8obyG5JJ3YObdDB+ZepiXKrInCEtzdq4VF8kJibi7++vc7PWu3dv/vnnn3q/+WqKpKWlERQURGFhod6+f//9l27duultt4Sl/5pguc+8AajpHc7378/k0tG/6bPjQ3777Tf69OnTUEO3CCpmj41be9Tk8+IyC3l2839G9zcFZ/6wYcMYNmyYwX21kQNYy6XIpRLyS3S1mTPvbYFUKtHJ54Ty97yDjRXjxo1j2LBh/O9//+Pzzz9HrVbj7u7OV199ZXTsZWVlREREcOXKFSIjI4mJieHGjRskJyeTlpZGVlYWqampxMXFaWdADWFlZYWNjQ0ODg44Ozvj4eGBt7c3/v7+BAYGkpVV/jzz8vKYMWMGa9euZe3atdofmuqc8IZc8B1vdh16+IvDVTYPNjcnvDAu1Q81KWh++uknvW0ODg6UlpZibW19u4faqMnPz8fd3Z1jx44xYsQI4uLitPvkcjkdOnQweJ45L/3XBlFQNgCmipsLD3Xj0tG/yczMpF+/frz66qu8/fbbes3sBfWHcOYbpqZyAE8Ha3a80JffziQQkVpeRPVr4cm9rbzYdyWFXZdu9bytLAdwdnZm+fLlPPnkk0ybNg03N7cqxyaXywkPDyc8XH+52BA5OTlcuXKFq1evEhUVRWxsLAkJCaSkpJCRkUFOTg6xsbFcu3ZNz6xUkTNnznD33Xfj7+/P2HETiLXqZ/RYQy54gIUj27L9bAInY7O0bdqMUdkJX1RUxPfff8/q1at55JFHmsxSZU1beI7rFsiDnfwJ83TAyVZOSk4xRyPT+fSva9zIKp9NshTjEtzquvT3lRRiMwxMSBgxL23dulVPSrJz505mzZrF6tWr78zgGyEFBQX4+fnRr18/Nm3apLe/devWFl9wm4ooKBuYqu5wHBwckEql2viYxYsXs2PHDrZu3UrbtuYxU9HYEM58w1RsRVYxrH9wG2+9Y385HU9OUSl/XU6mT3MPxnbxRyaREJ1ewOI/L7PmQKSOWclYUH+XLl04fvx4vT8XJycnunXrZnAJqzIqlYqEhAR27tzJ1KlTDR5TWFjI/hMXUPc0XFAac8E/3DWAcG8npm8+adK4NU54m8I0Vq9ezdq1a7Wmgab0fVDTFp5t/ZyJyyxg96VksgtLCXSzY3y3QO5t5cWwzw6Qklts9sYlME0yZcy8ZFWSw8GDFdp93jS9denSpdG3fL3dnD59mpycHHbs2EFgYCAFBQW88MILeHt787///U+sDNYAUVA2YmxtbZFUyL1Sq9WcP3+e4cOHc/XqVXHXdJsQznx9aioHyCkq46Xvz1R7XGOXA0ilUgICArSRRZobvDZt2vDcc88xYcIEXFxcOBWbyYOrDuudb8wF72At59Wh4aw5EEFidpHJ47lnwEDSr/6n44KXyWSUlpaSk5PT4G74xMREoqOj6dmzp8H9tWnh+cav5/Wus+tCEttn9mVslwBW7Y8wa+MSGDAv1bDrkv3l37X7OnXqxIQJE3jooYcICQm5bWNuKpw4cUL7uS4oKEAikdC9e3cee+wxRo4cKfrJ1wBRUDZibG1t9QwHEomE2NhYDh48yMCBAxtoZOaPxpn/+k9nUKlBLTFdtG6u2WOWLAdwdXXF09OTkSNH8swzz9CtWzedmz1DwfhVueCf7huGlUzKtrOJ2qVuH+fyPFNnWysCXGxJzi3Sa3GZk5UB6LrglUolmzZt0i7XacxINjY22NnZ4eTkpO2m5OXlhY+PD35+fgQFBRESEkJYWFiVsVU14YMPPuCzzz5jxIgRfPrppzRr1kxnv6aFp1Kl5mRspt75VbXwrIhmqdvJ5tZPmKaFpzkZl6A+ui6pKG5+H+FjZOxYPFPv/xNL58SJEzp/q9VqJkyYQFJSEi+99FIDjappIgrKRoydnZ2e5kXzd0FB1Z1LBHWn6MJeYlfPp9tzH5Ggcrb47DFLlgN06tSJlBTDWZygH4xfXSi+v4sNLnYK9sy+R+9aMwY0Z8aA5gz/7AAXE3O02yXAv3/t4JXZL7Bnzx6dc0aMGIGfnx8pKSmkp6drnfCaQPzS0lJtm09jVCxENc54FxcX3N3d8fLy0hqUKhaidna6/98lJycjkUjYuXMnrVu3Zt68ecybN097XG1beAK42Fkhk0jwc7HlhXvLXd2HItK1+83NuAT1ZV4qv/EpajmYExlWWEo9aaph6dChQzoTN1KpFFtbWzw9Pe/kcM0CUVA2Yrp27Yq9vT35+frdNQxFGwjqh+LiYt555x0WLVoEwO+vDCe1WCayxxByAGNUdMKb4oL/8nA0uy4m62xzt1fw/pgO/HAijt2Xkomr1O4yyN2OTu1as2vXLn777TdmzJhBfHw8arWaKVOmMGbMmGrHWVBQQFRUFNHR0VozUmJiorYQzcrKIjc3l/z8fNLT0ykpKanSmAS3ClFbW1vy8/NRq9Xa4vWdd95h2bJlPPXUUzz+1DO1auGp4di8gVhblcc0ZeSX8NZvF7TNBDQYauGZnp7Ohg0bSE1NZfHixdW+Ro0FU7suSSQwtnMAQ9v60NbPCRc7K+IyCtl2NoG1ByIpLrtVLJm7eammhqXc3FwiI29FdLm6uvLqq68yffp0nJ2Fe7umiBzKRs67777Lm2++iUQi0bmL+vLLL3niiScabmBmyokTJ5g0aRKXL5eHkkulUr0fVJE9dkvTVapUVdsdpyLmKgeAWzmUrw9vzZTeoey+mMyOc4l6x2lC8SsT4GLLwbmm51AWFhayZMkSVqxYwT///EOrVq3q9wlVIC8vj+joaKKiooiLiyM+Pp6kpCStMz4rK4ucnBwSEhKM5oJaeYVW28Lz5+d6cy05j4e/OKz3vuoZ5o61XEozLwce7OTPjnOJrNofoXedHTP70NbPmePHj7NixQq2bNlCaWkpNjY2TepGfNL6YzzWPchg1yU7hVxrXLJTyLi48D5Oxmby16UU0vOL6RLkytguAfwblcH4dbc0zxrNsrmZl2qU8Xxzf9/mHjhd/Z2Vi9/GxsaGJUuWMGXKFL1Zd4HpiIKyCXDo0CEee+wx4uLitEveK1euZPr06Q08MvMhNzeXZs2akZaWplNEurq6kpGR0cCja5zEpufT/9UvUHmF1+hL3BzlAHArGL8mofgVqaqghMYdjK/B399f25Ne09novvvuY8SIEVj5tGDhEcMzlJ4O1vz4bE/kMikPrjxUbdelIDc7dr3Yj/f+uMRXR2J09rWO286Zvb+SmJioNVsAeHt7k5SUVA/Psu5cuHABf39/o4H6mvdSlyBXzsVn6WhpQ9zt2DmrH7+fT2L296exkklo7++ip0l94d7mvDQ4nAnrjupIA6BpvJdMpaJhqaZd6MpKi3GL/Iuj334sTK71gGVNqzRRevfuzfnz55k9ezbr168H4Nw5XR2bmDWrG+vWrSM1tTxsu+KMZEO7ZhsrhYWFPDZqKFGHDnHfo0/S/bGXLV4OoHHCT1h/rFbGpRtZhQaLzcbuhK9IXl659jEkJISZM2fyxBNPaHNELyRkw5GDeufUpoVnbEYBFxJyGN3JX6+g/Gv3TkpTymeGK86WJicnY2VlpQ2wt7e3x8HBARcXF20bTy8vL3x9fbXdlEJCQvDz86vXTjIqlYpu3bphbW3NkiVLePLJJ3U6LsEt85IpxqVSpWGD084Lybw0OJzmXo46BaU5mZfqZFhSg0SuILPlcNYejhXdluoBUXE0ERwdHVm3bh39+/dn0qRJ/P3337UOuBXo079/f4PbRUsyXRYtWsT58+c5ffq0VhYwvHdnZpoQ1G8JWLITHuCLL77Azc2NQYMG6X12KhuXoHrzUlXYWElRyHQfQwLs/PEb5r78ol6GqaurK61atSIrK4u8vDytYen69esolUo9A6TOdSUS5HK5Vitqb2+Po6Oj1j2v6ark6+urNS6Fhobi5uamkwYA5ashhYWFFBYW8vTTT7NixQpWrVqlE7VUm65LlfF0LJ9xyywo0dluLual+jQsWXK3pfrEcr7pzYSJEyeSmFvK0v03GPzJPzUOuDXHpcb6oKSkxOD26Oho8vLy6i1WpanzzTffaAtJDRXbGVp6KzJLdsIDjBs3zui+2rTwlEkl2Ctk5BTpOtQ7BjgT7u3Ir2cSdLYHudsxoG8vjh07xvbt25kxY4ZWKnTPPffw888/Gx1fSUkJN27cIDo6mhs3bujoRCs653Nzc8nKyiI5OZnS0tJqTUtSqRS5XI61tTV2dnZ6nc7Onj1Lr1696N69OwsXLqRNxy5VmpeqMi5VZFq/MHKKStl3RT+dwJB56cSJE2zYsIHRo0czZMiQKq/d0NS021LHAGce6hpIp0AXWvk4YiWT6q0GmLth6U4gCsomxtbjsaxL8ME+zAuVuuYBtwtHtmWcuAvTQ9NxRINUKkUqlTJq1ChRTN7k66+/1ismAZYuXco999xD165dG2BUjQ/hhDdOTVt42itkHJk3kO1nE7makkthiZJwH0ce7hpAbnEZy/de0x5fsYWnRCLhgQceYPDgwXz88ce88847BAcHVzk2hUJBWFiYNsS+JuTl5RETE0NsbCxxcXEkJiaSlJREamoqGRkZOjFO6em6ekbNzOixY8e47777sPFtjvfkTww+jrGuS5V5rn8z+rbw5H+/nNMrxuFW16VmbtZ8//33fPrpp5w8eVL7OjT2grKm3ZYGhHvx6F2BXE7KITajgGae+t/pltBt6XYjCsomRN0DbtXM++kcaXnFQi9SiZycHJ2/J02axLJly3B1dW2gETU+/vjjD4PbExMT2bdvnygoK6AJxq+VWcCMnfA1beFZWKrkuxNx9AxzZ1h7H2zkMlJyi/jtTAIr9l7XBpyD4RaeNjY2vPbaazz//PN6M4P1iYODA23btjWpBeZff/3FoEGDgFudl5ydnRkyZAhjx44lR+HOon/1daTGui5V5v72vswZHM7W47F8cyzW6Dgef2IKlw7+oeN8l8lkWs1rQ5GQkMDp06e57777DEqOatNt6ZtjMazaH0FxmYqFI9saLCjNvdvSnUAUlE2E+tGLlGOpepGq9H3/93//B5SHyf/www8W39/WEJs3byYuLk6nJzBAv379REcJA4zrFkTvZh5M+ux3oottLT4YH2rewrNUqebt7RerPa4641JjyhTMysrS/nf37t154YUXGDNmjLbgvZCQDf/qfsZMNS71ae7BR490ZO+VFF7/Rb9lZUXOnTlFaaUYJaVSyYIFC1i0aBHW1tbY2tri4OCAk5MTrq6uet2WAgICCA4OJjQ0FBsbm1q8Gvp8+umnLF68mG7durFq1Sq9G9XadFtKyzMsaaqMORmWGgJRUDYBNHqRFl4OvDioJe39nfF0sKawVMm1lFzW/BPJX5cNd/GQSyX88UJfWng76sSRWIpexBTj0j0tPTh6KQZXV1euX7/e4HfojRWJREJAQID2b7lcjkqlom/fvnrGA0E5DpJijrw/gWade/PIa8st3gkPwrjUt29f3nrrLcaMGUOHDh309te065KGToEufDGxK+duZPP8tyerfH0lwJuzp7Pk/XfJzc3VMSS1bt0aa2trcnJyyMvLIy0tjfj4eEpLS41mjGrQhNxbW1trXfTOzs64ubnh7u6uNS5VbP1Z2UWfmpqKVCrl5MmTdOvWjaeeeor33ntP27mmLt2WqsNcDEsNhSgomwAavYi/qy0O1jL+7+QNknOKsLWScV87H9ZP7sb8n86y5Xic3rmTe4Xgd7NXcEXMXS9iStCtxri0+Vgs6mGv08/bmnxssPRysqqZ3NOnTwPleYP79+/HyclJaEwrkZeXx4kTJwgODqZ3796UlJTgqM5ngXDCA8K45OXlxYIFC4zur2nXJYBmng5smNyNG5mFTNl0XKc7jiGC3O3435xXmPX8s7z99tt88sknqNVqlEolS5cuZdiwYQbPU6vVZGRkEBUVRWxsLPHx8SQkJJCcnExaWhrp6elkZ2druy1lZmYSERFRIxd9SUmJTuG6fv16Nm3axLBhw3j+xZfr1G3JFAwZlgSmIV6xRk5Fvci+K6nsu5Kqs3/TkWi2z+jD1D5hegWlu72CWfe2YPU/Ebw8OFxnnznrRSoG3YIJxqWbu8+lllisccmUmdz+4Z5kqmxwdnbm8uXLopA0wg8//MCUKVOQSCTaH9HAwEDtfkt3woMwLlWHxrz0+vDWJhmXvppyN862Vqz5J4J7W+nqUWMz8nUK0YrmJUdHR5YsWcLUqVOZMWMGe/bsISjI+GspkUhwd3fH3d2du+66q0bPqaysTOuir9xtKT09nYyMDHJycoiKitI5T61WU1paym+//cYfR89V223JFNNSVWgMS5b+Ga0NoqBs5FTUixhCpYaE7CI6Bui/+efe14rItDx+PhWvV1CCeepFhHGpZtRkJvebozHYjHmXuzxkZJZIEeWkYVJSyuUnFWdk/vzzT7755hsmTpzYUMNqdAjjknE05iVTjEuudgr8b65CzRvWWu+YH/+L0ykoDZmXwsPD2bVrF0lJSfj6+tbjM7mFXC4nJCSEkJCQKo9r1aoVV65c0cpobG1tmThxImPGjKHA1ovZfyQYPM9U05IplFQzwyswjCgoGzmG9CK2VjJsrKQ42lgxuLU3/Vt6sr1Sz+CON/O5Hv7isG6ScAXMTS8ijEs1o7YzuZcyVBY7k1sdZ86c4a233tLbnp+fz9SpUxk7diy2tvoSFEtFY1zS3NRIUKPGuB7XEoxLULOuS8Y6LBmiKvOSRCK5bcVkTcjPL8+PbNmyJbNmzWLixIk4OpaP90JCNqBfUNam21JVKOSioUVtEAVlIyavuMygXuR/I1ozoXt5pppSpebPC0m8+auuo2/hyLZsP5vAydgsAgxoKDUY0ov8+++/fPbZZ/z+++/8999/hIaG1tMzun3EZRTw9dEYPn+sS7WmpXHdAnmwkz9hng442cpJySnmaGQ6n/51TSeGxJyNS2Im9/ZQUlKCo6MjxcX6P2h//PGHKCYNEOhmxzsDvWn12jgGP7uQHMdAizcugeWalzZs2IBCoaBfv356Zr/67rZkCMnNxxHUHFFQNmJi0vMNTi5uOBTF7+cS8XayYUQHX2QSic4d1cNdAwj3dmL65pPVPoZGL9Lc3Ybvv/+eZcuWcerUKW0+WsWIi8bMaz+fw8fJxiTTUls/Z+IyC9h9KZnswlIC3ewY3y2Qe1t5MeyzA9q7W3M1LomZ3NtHt27diIyMNNgDvlu3bg0wosZPdnY2d999N8WpqTzV2YnRowdYvHEJLNe8NHjwYKP7atNtqaYEudtZ3HutvhCvWiPGmI4jIjWfiNTyZYGfTsXz1ZS7Wfd4N0avPISDtZxXh4az5kAEidlFJj3Og2MfJvL4Xp0WYhqX3cGDBykoKCAgIAB/f3/k8jv7likoKKBv374MHTqU1157zaARpKJxqXJ8kiHT0hu/6uez7bqQxPaZfRnbJYBV+yMA8zQu1SSCSiKBsZ0DGNrWh7Z+TrjYWRGXUci2swmsPRCpdZKa80xubXB0dNTekHl7ezN16lSSk5OxsxOvT0W+/PJLLl26xLZt20hN1TUbCuNSOcK8pE9Nuy0B+LvY8mDn8n0d/MvfVzMGNAcgPquQn0+VH1fRsCSoOaKgbMSYquP441wi74/pQJiHPaM6+WMlk7LtbKJ2qdvHuTxw1tnWigAXW5Jzi3Q6CyQnxhvtR/vCCy/obZPJZFhZWWmDb+3s7LR5Y87Ozri7u+Pp6Ymnpyc+Pj74+/sTEBBAYGBgjX9Ub9y4wcmTJzl58iTr1q3jo48+YsKECTq5ZVUZl6oyLek8zs2lbicb3Y+EuRmXahJBZWslY+nDHTkZm8nmY7Gk5xfTJciV2YNa0ruZB+PXlQdTm+tMrikYmkmztZKiVqtRKBScOnWqUejSGiMrVqzQtvvTcO7cOUaPHt0wA2qkCPOSLjXttgQQ6GrLnCG6xlTN30cj07UFpSHDksB0REHZiDGkFzGEjZUMAEcbOf4uNrjYKdgz+x6942YMaM6MAc0Z/tkBLiaWtxqUAPGXT7Nvz05mzpxJTEyMjjt13bp1pKSkkJqaSlpaGhkZGWRlZZGTk0Nubi4FBQXa4NuysjKjhWlFpFKpNnNMU5Da29vj5OSEi4uLNgTXy8tLpy1YWloajz/+OMuXL2fFihXcfffdgL5xyRTTEoCLnRUyiQQ/F1teuLdcB3goQrfPriHjUnR0NMuWLWPDhg18+eWXPPTQQ9U+58ZATSOoSpUqxqw6rNONYuvxOG5kFvDS4HB6N3PnUES6Wc7kVkV1EUuedhJcBj7NpzMeEsWkEW7cuMHVq/qzbm+++SbFxcW8++67DTCqxovGvPTqD6c4Ep2FTHLLJGcIczYv1bTbEsDRqIxqjUvVdVsSVI8oKBsxlfUi7vYK0vN1W0jJpRLGdAmgsETJtZQ8vjwcza6LyTrHuNsreH9MB344EcfuS8nEVTD6BLnb4WBjxf3338+QIUP47LPPeOuttygoKMDW1pannnqqxuMuLi4mPj6euLg4EhIStFljqamppKenk5mZqS1I8/Pzyc7OJiUlhdLS0ioDcDXbjx8/Tvfu3XF3d6fvgEHENp+kc5wppiWAY/MGYn2zGM/IL+Gt3y5w8GbBVRGNceny+TMsXryYH374AalUilKp1EbENAZycnJ48cUXmThxIvfee6/e/ppGUJUqDbc223khmZcGh9Pcy1FbgJvbTK4hTI1YSilQ43zXA7xxtIRdacfM7ge9Pli0aBF5eYbNE35+fnd4NE2DQDc7AiN+5f82bOWFz37geEKBxZqXLNWw1NgRBWUjp6Je5L0H2+NgLeff6AySsovwdLRmdCd/mns58M6OixSUKLmQkMOFhByda2iWvq+m5OkUm5X1IgqFgjlz5jBp0iRef/11cnNzazVma2trwsLCCAsLq9X5KpWKpKQk4uLi+OGHH/joo4+0+zRh0dbW1rRq1Qo772C9GdzqTEsanth4HGu5lGZeDjzYyR87hczgeNRAUNuuZESc1T6+ZiZ2//79yOVynJ2dcXFx0f5zd3fHxcXljmpOT548yZdffsmXX37JkCFDWLp0Ke3b3/qCrG0EVWU8Ha0ByCy4dXNjbhFUlalpxJIm+uZwZLqIWDLAO++8Q0pKCj/99JPOdj8/P5577rkGGlXj5tChQyxZsgSpVMrSx8rlJZZqXrJUw1Jjx/zfeU2cinqR7WcTeOSuQCZ2D8LFTkF+cRnn4rP54M9L7LlU85kyY3oRb29v1q1bV9eh1xqpVIqfnx9+fn6cPXsWKNdtqlQqRo4cyaxZs+jfvz8SiYRTsZkcWnVY5/yqTEsVORJZPru272oquy8ms+vFfuSXlPHVkRi9MeUVlBucKs+efv/993z//fdVPh+JRIJEIkEmk2n/WVlZaf9ZW1tjbW2NjY0NNjY2WhmARgrg6OiIg4MDjo6OODs74+TkhJOTE25ubri4uODq6oq7u7uOPGDv3r107NiRyZMn88477+Di6VPrCKrKTOsXRk5RKfuu6L7njLUsU6vVXLx4kdDQ0CZpTBERS/WPh4cHTz/9tE5B6eLigo+PTwOOqvFRWlrK3LlzsbW1ZenSpdrtarUaiURi0eYlYVhqfIiCspFTUS+y7Wwi285WPXtkCEPBt01FL6IpLCdNmsT06dMJDg7W2W+KcamiaSkyLd/gMbEZBVxIyGF0J3+DBeWmL9fz2cJXOXLkiE5LvXfffZd27dppdaWapXzNcn5eXh4FBQUUFhZSUFBAUVERxcXFFBUVUVJSQklJCfn5+ZSVlWk1qCqVSqeXbW0oKysDYOPGjWzcuJHQLn1RD5mrd5yps7kanuvfjL4tPPnfL+fIKSrT2Ve5ZVlaWhpff/01q1ev5urVq3z66acGTV6NGRGxdPuo2I5y8+bNjBs3rgFH0zhJSkpi2bJlOttUKhUJCQn4+/sbOctyEIalxoUoKJsAlqwXGTFiBPHx8Ub3m2JcqmhaqgobKykKmX4xJQEe6N+DR4cc4rfffuPll18mIqI8Wqh79+4MGjSouqdRa0pKSsjIyCAzM5PMzEyysrJ0iteKWtTz589z7NgxvWvIZDLsHZ0xJGAwdTYX4P72vswZHM7W47F8cyzW4HhT0zPZdf4Y69ev56efftLRxNrY2NT+hWgAahKxBOXdqR7qGkinQBda+ThiJZPq3chZasSSoaVZTVTQc889x2OPPdbAI2ycnDhxwuD28PBw9uzZQ48ePe7wiBoflbstoVaBxPhNsTkblhoaUVA2AYRexDgVjUummJZkUgn2Cpne7FrHAGfCvR359Yx+W6+KQbejRo1ixIgRrF+/no0bN9KmTZvb9+Qo17X6+PiYtBS4du1ajh07hkwmQ6lU0rZtW+bNm8ejjz7K1dQCRiw/WO01jM3m9mnuwUePdGTvlRRe/8X4kviQQfdSmhJlcN+GDRs4d+4cISEhtGjRgtatWxMaGnrHs01NpSYRS1Cud370rkAuJ+UQm1FAM0/9zFRLiliqzg3vICkiaPTLvPDGGw01xEaNSqUyaopUq9W4ubnd4RE1XgLd7Fj5SBt8W3Wh88MzkQa0t1jDUkPSOL/JBXoIvYhxNMYlU0xLTjZyjswbyPaziVxNyaWwREm4jyMPdw0gt7iM5Xuv6VzbUNCtXC5n2rRpTJs27U4+zWrRzAD279+fuXPnMmjQIG3rstpEUGnoFOjCFxO7cu5GNs9/e7LKmfJXpz/J559+bLDD0rFjxwzOoEqlUqytrbG3t9camjT5pRWLz2bNmtVb8blp0ybef/99lixZwgMPPKC3v6YRSwDfHIth1f4IistULBzZ1mBBaQkRS6a64XPVNshbD2Dopwfp29xDzBZVQiqVsnPnTkaOHElSUpLOvmnTptGyZcsGGlnjo6CggC5dupCfcJ0OpVf4fM4LFmtYakjEq9uEEHoRw2iMS6aYlgpLlXx3Io6eYe4Ma++DjVxGSm4Rv51JYMXe6zq9vKFpBd2OHz+egQMHGoxdqU0EFUAzTwc2TO7GjcxCpmw6ru2OY4hgdzvenfMGC994jTVr1vDqq69SWFiodcRHRERgY2PDpUuXuHr1KlFRUcTGxpKYmEhqaipZWVkkJSURHR2t1YBWRlN82tnZGSw+mzdvTuvWrWnRokWVxeeRI0e4cuUKI0eOZNSoUaxYsYKAgADt/ppGLAGk5ZUYPLYy5hyxVFM3vCZLUbjhDdOtWzeGDh3Kpk2bgPIVCxDRShpWr17NwoULkUqlJCSUry5pXhtLNiw1FKKgbGJU1otYcsCtBo1x6ffzSdWalkqVat7eftGk6zYV45IGuVxe5Q9NTSOo7BUyvppyN862Vqz5J4J7W+l2oojNyNf2zq04kyuTyZg+fToPPvggs2fPZuvWrQD4+vpia2uLn58fAwcOrPb5JCUlcfHiRa5du0ZkZKRO8ZmZmUlKSgoxMTFVFp8KhQJ7e3ttBydvb28CAgL4559/tMdt376dXbt2sWjRImbOnIlcLq+3iCVDmGvEknDD3x408W0ODg6cOnWKkJCQRisTudNoco4r8uOPP/LQQw8RHh5u5CzB7UKiNpYiLWj0XEvO5ZklX3O9wBq5s49F60XiMgoYtGx/lTNoNcVaLmXP7HvMpgi/lpzL4E/KC6kHOvjyyF2BtPJx1JnN3XQkWjubG+Biy8G5+gHpGn78L445P57V/r1ndj+D77M9e/Zw7tw5Zs+eXc/P6BYpKSlcvHiRq1evGiw+c3NzKSwsNFp8apDL5Yx+6FGOh4zX27dodDu9iKX5P53V0+MCLBzZlsk9Q4x255AA5xcM1VmCi46OZu3atWRnZ7NixYoaPPuGZ+vx2HrVeH84pr3ZraSYgqFl2rGj7mfXrl1cunRJFEkVyMrKokuXLkRF6Wu23dzcSE1N1WnRK7j9iNucJoxdWQ77P56BnZ0dyelZFq0XEcal6qlpBJWhuClDVDeTO2jQoNvqhAfw8vLCy8uL/v37V3tsWloabdq00bqMK6JQKIhMzYUQ/fNqGrFUFZqIpVbeDvz+++98/vnn7Nq1C7VajYODQ5MqKGvqhodyKcWb97fmrmA3SpUq9l5J4d0dl8i4KcOwJDd8deYlScvHuKfdSKQuYpm7Ilu2bDFYTAJ89NFHophsAMQMZRNk586dyGQyZs6cyeXLl7GysqK4uFhrwLBk6rLsVpFXhoTz/IDm9TCixoWYyS3H1taWoqLysPqAgACmTZvGE088QUBAAKdiM3mwUli+Ib6acjdONlYGI5aqm6EEcDyymoh//6KwsFAn2zQwMJDYWMOxTI2RSeuPcTgynb4tPHiyVwgnY7N03PDdQ9113PA+TjbsmNmH3OIyNh6Oxk4h45m+YSRkFTJq5SFKlWrtTYo5u+FNMS9p0EibhHnpFiUlJWzcuFHPHCmVSikpKUEmM9z5THD7sJwpLDNBrVYzcuRISkpuGQBKS0v5v//7P0aPHm3x2hphXKoaMZNb/hm666678PX15emnn2bgwIE6sxmmzjqaEphfFVcuXaD0Znejivf1cf/P3nmHN1W2YfyX0aZN996LAmXvKXvJcoCAKAgoCCIgshRFkKG4EEUQxIGAiggOFMEPFFmyN5QN3XvvnfH9ERKSJp0UWtLzuy4u7Tknp+9JM57zvs993zExujQlKysrbG1tcXBwwMnJCTc3N50Iyd/fnwYNGtCwYUPc3d3vy4zMtm3bWLx4Me+99x7Dhw83ummtjhp+ep+GyC2lPP75EeKzNEX9xZhMtrzYhZHtfNl6Osbs1fCCeOnesbS0ZPLkybz88su6IIjmzZuTnZ2NQqEQCspaoH5XHw8hIpEIOzs70tLSDLaPGjWKGTNmsGbNmloaWd2htHBJrVIiEpf94VIfhEv61HcLKpFIxH///Vfm/nuxWKr0GICrJw/xxrzZ/PrrrwYzlF5eXjRp0oT09HQyMzPJzc0lPT2dGzdu6BTzptCKkKytrbG1tcXR0RFnZ2ddEerr60tAQAANGjSgUaNGODk5VTjOkydPcuPGDUaMGEH//v1Zt24djRrdFcxURw0/qLkn/15P0hWTAEfD0ghLyWVoK29d4WmuanhBvFRzaGNtAX7//XeefPLJWh5R/UYoKB8yvvrqK6NiEjRvrNGjR9fCiOomfs5yvh3fDreGrbBtPYjgnk8IRrd6CDO5ZVNdi6Wq4O8ip2GgH7/88gsHDx7kpZde4tatW6jVagYOHMjGjRvLfGxqaiphYWGEh4cTFRVFXFycToCUnp5OVlYWubm5pKSkUFxcXG6Mp0QiQSaTYW1trcuKd3Fxwd3dHS8vLw4fPoxYLEalUnHgwAGaNWvG66+/zltvvYVcLq+yGt7DXoabnYzQuCyjsVyMzaRPyF3P1/LU8AqFgszMTFxdXSt8rusSQpRn9TElWCrKywZgzJgxQjFZBxAKyoeMhIQE3Qe8Pr6+vnTv3r2WRlW3OHHiBC4uLixbtoys6OuoMuI4tPNTwei2FKVncsVAeZ2V9Wkmt6oWSwA+jtYMb6vJV27lo5mRm3GnDzcus4Ad5zURoqXN8nv37s3ly5dZvXo1b7/9doWG1a6urri6utK5c+X6C1UqFUlJSboiNDo6mri4OBITE3VFaHZ2NhkZGSQkJFBSUmKyCNXOjr733nu8//779Ow7gKiOr6C5NbvLwqFNjdTwb/+hSVdyt9OY7yfnFBmdPzm7CCe5JZYSMcVKze+PTssnr0ihe58mJSXxzTffsHbtWrKzs8nMzHxo2nxi0vP55WwsS59oTtcGLvg6WZORX8L56AxW/nOTiFJtE+O7BjC+SyB+ztZk5JWwKzSelX/fpKDk7iy1uYuXKhIsedpJ8Rs2hxlvTautIQroIYhyHkIuX75My5Z3c7hFIhFOTk4mZy7rGyqVCisrK0pKSnTbxGIxCQkJuLu7l/PI+s2tpByGzHwfsV9Lii3s6/1MblUtlgC6BDnz05SuJs93IjyNZ74+ofu5LIulwsJCpFJprRdJKpWKmJgY+vXrp8ut18fBwYF2fZ8gPMR4VSTYzQZPeyudGr5EoWbhH6Gk5hbTMdCJn196hOk/nmN3KQ/P2f0b82q/RrRautfAimn3jO5kRl7m888/55dffkGlUqFSqR46MeK4DScZ09mf9v5O7L6cwPWEHNzsZEzoGoDcUsrwL45yM0kz2/3GoCZM7RXM7tAEjt1OpaGHLc91DuB4WBrjN57SndNcxUtVEizd2S8Ilmqfh+PWTsCA5s2b6/Kax44dy/r168nLq7oowBwRi8U4ODiQmpqq26ZSqfD09OSjjz5i3rx5tTi6uoVarWbMmDF4eHiQl5fH7e3fMGLECDZv+anez+RW1WIJ4EREeoU2SxVZLGnjM2sbsVhMQECATgkPmt7OadOmMXHiRLy9vctUw4el5BGWovk8+u18HN9N7MQ34zsybN1RCks0M4+mhE+yO9u0x2jp2KUrBbHXjI4XiUTMnTtXJ1Ly8/MjMDAQHx+fBy7IWLFiBXl5ebz22mvY2NgY7deKl/KKlcyMO0+JXhrFrkvx7H21Jy/3asjs7Rdws5MxqXsQv56LZe7PF3XHRaTmseyJFvRr4q6zYTJH8VKVBUt39guCpdqnfn1LmAkikQiZTIZarebbb7/F0tISW1vj3OD6yO+//25QTGpRq9WCKXApVCoVv/32m4FjwOnTp9m25TtGjRqFnV39ji17b3hL+n96qEr9pRUhFYt4b3jLig+sI7Rt25YWLVowY8YMBg8ebFCoVUcNn5yjKVDd7WRGx7nby8jIL9Ytd2uxs7GmwOhojW3Mp59+avJ3ikQipFIplpaWWFlZYWNjg729va5H1NXVFQ8PD7y8vPD19cXf35+goCCcnZ0rdU2lWbNmDTExMXz11VesWrWKUaNGGcycasVL56IzjB4bmZbPzeRcGrprPsPb+TthIRHz56V4g+P+vBjPsida8HhrbwNfT3MSLwmCpYcboaB8SNDv/5OI1CiQ8MmK93XZrgIaVq5caXJ79+7defzxxx/waOo2EokEPz8/gyXN6OhoJk2aRFhYGMuXL6/F0dU+gsUS/Pnnn2Xuq44aPjw1j9TcIlr6GN+stPZ15Gp8tsE2ERB+8SQXzpzk5ZdfJjT07t+iQ4cO/PLLL0RFRREdHU18fDwJCQkkJyeTlpZmIFDKzs4mOTmZkpKScpXyoJmdtbCw0ImVbG1tsbe3x8nJCWdnZ9zd3fHw8MDHxwdfX18CAwPJzMwENHGho0eP5vPPP2ft2rW61iRT4iV9XG0tuXVnuVs7U1tUaqZW2zvZslQ+dXnipYyMDCQSCfb29uVec11AECw9/AgFZR2mvIZkr5k/8lOuNSk7rzC2sz+NPMxjueNe2blzJ5999hlLly412K4/Cyeg4cKFC0RFRRltDwwMZObMmbUworpHfbdYKo/qquH3XE5kRDtfvBysSLhjHfRIsAvBbrZ8e8Qw+cTfRY6NTEq3bt04f/48GzZs4PXXXycrKwsPDw8CAgIICAio8tjz8vKIjIwkOjqa2NhYXSZ0SkoKaWlpZGZmkp2dTW5uLsnJycTExKBQKMpVzMNdP9H//vuPVq1a4efnx+ixE4imS5mPGdbGBy8Haz75R/MaC0vRPE/tA5w4Hn63L75ToGb21MPBuC2itHjp9OnTfP7552zdupWhQ4eyY8eOKjw7Dx5t2lIrXwdGtPOtlGhpaEsvXuweRLCbLUq1mpuJOaw/HM6BG5rZW3MXLNVFBFFOHURoSL43cnJydHfkTzzxBL1798bX15dRo0bV8sjqDqmpqYSEhJCenm6079y5c7Rt27YWRlV30e/rEiyW7rJk5xWdGv7L59qXq4bfcKdY9HKwYvcrPcguLGHj0UhsLCVM6dmAhKxCnlx7VLfkLRGLGNc5wGgpNz09nQ8++ICOHTs+8Pe0SqUiNTWVqKgonWVTeHg4q1evNnm8tbU1vi27UNx3rsn9wW427JjWjVtJuYz68hjal9aOlx+hkYcdS/+8wvGwNBq62/LusBa421khFkHDhf8zOteOlzpx+b89rFq1inPnziGVSlEoFAwbNqzOF5TatKU1z7SlQ0DFoqUJXQNZ+kRz/r2exP5rycgsxIxs50szbwde+uEse68kmq1gqS4jFJR1jHv94hIakjWzBNplnpSUFCwsLGp7SHWOlJQUhg0bxvHjxyn9EXDgwIFKZWLXN/Rv9FApoRJm+eZ+o1cdNTxAI3dbFg1tRodAJ0qUavZfT2b5X1dJzTWc4SxLDV+XCA8PJzg4WGdOb2dnx6RJk5g2bRqNGjUqU7zkZivjl6ldkUrEDF931MBKycNexufPtqPjnVlJhVLFN0ci6NLAmQautrRa9rfR+RI2z6E4wXAmXSQSERgYyGOPPYaHhwfe3t54e3vj7+9PQEAAcvn9f10mJSXRokULnn76ad555x2jPlX911A7fydC4zINREuBLnL2vtqTvy4nMnv7BQD2z+1FdoHCIPbUViblxJv9OB6WyuTvz+q2PwyvIXNBWPKuQwgNydWjtL+kKisJtVrNDz/8IBSTZeDm5sbRo0e5fv06TZs2BUAul5Ofn09sbGwtj65u4ucs5/tJnZky721+uZhE8/6jiM0sqtcWS9VRwwPcSs41sL8pTUVq+LqE1uKpefPmvPrqq4wZM8agUDMlXrKTSdn0QkfsrS0Y9eVxI1/OpOwiRn15nEAXOW52MiJT80nJLeLkm/3KjPm0lIop3dijVquJiIgoN0FNG/Op7RnVCpgcHR11cZ/u7u4Ganp/f3+cnZ0rFfcZERFBamoqX3zxBVu2bOH9999nypQpOoGXftpSZURL2uev9BJ4bpGC/CKFgUuAOQmWHgaEgrKOIDQkV42KDG9bvPkrJxX+hCTlCP2lepQuvksUmmdu9uzZfPTRR1y+fJkmTZrU8ijrHsePH+f27dsEBgbyzSfvAvDfP18KZvkIanh/f3/S09NxdHQ06YlZWrwkk4r5ZkIHglxteG7DSW6Xk7QUmZZPZJqmR7Whuy0e9lb8ctb4hk8ExN+4yK/bfmTevHlkZGSgUqmQSqUsXLiQyZMnExUVZdAvWlq8lJOTQ15eHsnJycTGxpZpcK+PWCzWqemtra2Ry+W6xCUnJydcXFzIzdVcn1qtJisri2nTprFmzRq++OILevXqVaFgCQxFSwAnwtMZ3MKTCV0D+fdaEjILMRO6BmJnZcHGY3f7cMsTLAnUPMKSdx0gJj2f/p8eokhh+Oad3rshrw0M4UZiDgM/O6zb3qORK4+19KaNnyMN3W1JyCqg+0cHDB4rk4rZN7uX2S21Cf2lVae84hvUKLOSGd+/Hc93CxaK7zJ48skn2blzp8G2w4cP071794fGWPt+8tPp6BpVw3/4VEuzuiHuteIAUen5iEXw5XPt6R3izuTvz3DwRkqlHi8SwTfjO9C1gQv9PzlkkIMOEOAi59C8PgBkZWWxbNkyPvvsM5RKJWvWrGHGjBnVHntmZibR0dEGSvqkpCRSUlLIyMgwEDAVFBRQWFhYKTU9gJ2zG86Tv9VcYBkMa+PDqtFteO2Xi/x8p5h2sbHks2fa0r3h3ejNtNwiJn9/hnPRmQaPFwGXlwysdzd6tYHwDNcBFuwI1Zm4avG0t2J6n2DyihRGxz/Z2pvHWnlzOS6LpOxCo/0ACpWaBTtCzaohWTC8rRqVK75FSBw8+OlsPFtOx9X74rssfHx8jLb17NmTXr16cfDgwQc/oDqGoIYvH22U51tDmjKgmSf/XE3C0dqSYW0MX1e/X9DEcy5+rBkyqZirCdlIJWKebO1Na19H5v5y0aiYLB3l6eDgwMqVK5k8eTKffvopAwcOvKexOzo64ujoSKtWrar82MLCQj744AOWLVum69XW9pq6uLjQedBwrpRTTAa72bDsyeacjcrg13N3Z2YLSpSEp+SSmFXAv9eTsZVJmdgtiPVj2zPqq+NE3ZnVBc3McGRaHs1L2S0J1DxCQVnLaBMUSvPWkKacj85EIhbhJDf0mvxo7w3e+E1ThG6Y0IEQE7NK5pagIPSXVg2h+K450tLS+P33303ue+SRRx7sYOowM/o0wtVWJqjhTTC2sz+bjkfSzEvjPjGgmQcDmnkYHactKK/EZzOxWyBPtvFBpVZzMTaLsRtOGtgIaVGq1DzXxfg5a9KkCV9++WUNX0nVsLKywsLCArVajUgkwsbGhkmTJjF9+vRyBUugES19O6EjOYUKXt5yFv2X07ox7VCo1Lz43Rndtr+vJnFwXm9eezSEGVvPG5yrWFH+0r1AzSAUlLWMfkOylk6Bzgxu4cnQNUdYaqKZuHQDd1mYS0Oy0F9aNYTiu2aZMWMGCQnGYpMmTZrUe/P30jzT0Z9uwa66mXG1SomoEmr4Rxq4mPXMuFa8NHbDyUoV2r+ci+WXcxWL4x4G8VKzZs3o1KkTkyZNYuzYsQbRlGWlLZUnWvJzsqZ3iDtv/HbJ4DFZBSWciUynfYCT0fkqm+okcG8Iz3ItU7ohWSyCpU80Z9uZGG4k5dzTubUNyQbblEp27NjBgAED+Oqrr+7p/A8CreGtKab3bkjk+0PZ+2pPo33t/J34+aWuXFs6iNML+rH48WbILTVfbG/vvEJMer7RY8yBmi6+t52OrpFzPczMmDGDkSNHGm23s7MT+idNoFXDPyY6T8653XjbSSn9LInQ9P2N6xzAvtk9+X5SZ7MtJrW8N7wlUnHNvl4eBvHS8OHDOXnyJFOmTDHKOdcKlvTRFy1N2nzaSLTkdie2U2LivSeViI2eY9Gd3yNw/xFmKGuR3CIF0aUKm7GdA/BxtGbshpM18ju0CQrF+Tls2LCBVatWERenWVYJCgpiypQpNfJ77hem+kuh/B7TZl72/PhiZ24n5/Lu7qt4OlgxpUcDglxseH7TabPsL4W7xXcjd1tm9W9MSx8H3GxlFJQouZWcw1eHww0ygAHGdw1gfJdA/JytycgrYVdoPCv/vqmLeRPSJqBbt25069YNGxsb8vPz8fPzw8LCAmtr69oeWp0jIiKC27dv4+DgwBcfLkalUvH7lnewcXCu92p4IcrTmNJpS2IRfP5sW9r5O5kU2IBG+a5UqXmslTdbTt294fW0t6JjoDNnIg3DGrRpSwL3H+FZrkWi0vIMFLeOcgvmDGjM6v23SM8r7ShWPdRA6+79iTx/xEB1J5FIUKlUFBYWYmVlHOX1IDh06BBjxoxh3rx5TJ8+3SiXvKz+Uii/x/S1gSFkFZTwzNcnyL1TcMZmFPDhiFb0aOTKf7dSzaq/VIu2+PZxssZWJuHXc7EkZRdibSFhUAtPNkzoyJu/XWLr6RgA3hjUhKm9gtkdmsDGoxE09LBlQtdAGrvb6TwCzbX4rghTdkAWFhZYWVlx/fr1B2II/TDy3nvv8c033xhs++effxg7dqwgikAQL5lCK1hSqtQsHNqsQtFSel4x28/E8Gwnf358sTN7riRiaynluS4BWEnFrDsYpju+tGBJ4P4iFJS1SOlG4XkDQsjML2Hz8cga/T0xcQlGFg5KpZINGzawYcMGQOMnJpFIsLS0RCaTYWVlhVwux9bWFltbW53Sz9nZGVdXV9zc3PDw8MDLywsvLy+8vb2rbCIeGhpKfHw8c+fO5fPPP2f16tUMGTJEt4xoqr8Uyu8xtZVJ6d7QlQ1HInTFJMBv52NZ9Fgzhrb04r9bqeX2l4aGhrJ//35eeeWVShn31gX0i++DN1KM7Eg2H49k14zuvNi9AVtPx+BmJ2NS9yB+PRfL3J8v6o6LSM1j2RMt6NfEnX+vJ5uduKs8KvI2tX3mY/r52xKXo6SRUE+axNXV1Wjbc889x7p16zhy5IjQIoAgXiqNVrAEVFq0tPCPy1xLzGZ0Bz9eH6jxzb0Um8ncny9ySm+GsizBksD9QSgoaxH9RuFAFznPdvJn2a6reNjdnTGUScVIJSJ8Ha3JKVKQVVBS5d/z7ddf8cEbM7h8+bJum0gkonfv3gQGBpKRkUFWVpbOSyw/P5+CggJycnKIiYlBoVBUylMMDI1utckL2sJUa3jr7OyMs7MzoaGhiMViVCoVERERPPbYY/Tt25fVq1fTvHlzk4a3FfWYhnjaYSERExqXZbC9RKnmany2bpbElOHtiRMnePfdd9m9ezcAgwcPpnHjxpV7ku8zs2fPxsLCgvnz5+Pi4mK0v6ziW4tKDfFZhbT21Vx/O38nLCRi/rwUb3DcnxfjWfZECx5v7a1bHjcXcVdZVMZeSQ1Inby4kCtiwKrDgr2SCTIyMtiyZYvJfZ6enkIxqYcgXrqLftrSM1+fqNRjlCo13x2P4rvjUWUe8zAIlswNoaCsRfQTFDztrZDcyeI2pew+Mr8v3x6NYNmuq1X6HSJgWP9uPHvxIj/88APz5s0jLS0NlUrFuHHjeOGFFyp9LoVCQVJSks7cNjExkdTUVFJSUkhPTyczM5PMzExycnIMCtOMjAxKSkpQKBRlJi9oPcr2799PixYtcPbwxu75L40MbyvqMXW/07CdnGPsz5mcU0inwLs5stFp+eQWlnD8v4O88847/Pfff7o4MLgbqVYX2Lx5MxkZGaxbt4433niDV199FTu7ux+UpopvawsJVhZi7KwsGNDUg96N3dgVqlEry+7czBSVGP49tL2TLfWWJ805baLK9kpqwV6pLFavXk1MTIzRdmtr6zILzfqMVrzUd9gYLhU40Lz/KKLTC+pllGd9T1syF+rON2Y9RL8h+UZSDlO+P2N0zNwBIdjIJCzbddXArLWy6Dckjx8/nqeeeooPP/yQVatWVTliTyqV4uPjY9LkuSoUFRWRmJjIrFmz+PPPP3Wzn9oZDF9fX3oPf47DpYrJyvSYWlloCkJTvmNFCpVuP2gKefcGzSlIuKXbpj8T26ZNG6RSKRKJRPdPKpXqtmn/38LCwuQ/7SytpaWl7p+VlRUymUz3T/uzXC7HyspK98/a2lo3uyuXyyku1lxvXl4eixcv5pNPPuHtt99m6tSpKERSI3EXwMKhTRnbOUBzXSo1e64k8vYfmlnqsBSNcrJ9gJOBt5224PZwMOyr1Yq79Jvbi4qK+OOPP7C0tGTYsGEm/x51GcFeqWZ59dVXcXZ2Zvbs2Qbvo+Li4oemdeRBkZiYiEQi4dy5cxz4YytisZhDe7+ot1GegmDJPDD/V2odR9uQnJFfwt9Xk4z2T+wWBFga7GviaUf/ppr+kkBnG+ysLJjRpyEA1xKyDZYqSzck29ra8s477/DOO+/cpyuqGJlMRkBAANbW1rovHnd3d2bOnMnkyZNxd3fnfHQGh0sZ3lamx7TwzgybKd8xmVSs26+ldbv2nNkbgUJhrBZ3cnJCrVbrlvyLioooKChAqVSiVCpRqVSo1WpUKpXu//X/3S9UKhUZGRnMnj2b2bNn492sExZPvG103LdHI/grNAEPeyuGtvJCIhLpnpcr8dmcj85gaq9gkrILOR6WRkN3W94d1oJihQqrUs+fftrEhQsX2LBhA9999x3Z2dk0aNDgoSsoBW/TmsfR0ZFXXnmFFStWEBMTg7OzM08++SQpKSkGM/8C8OijjxIaGqq7iVapVKSkpODm5lZvxUuCYOnhRygoaxn9huTK0sLbgXmPhhhs0/78y9kYXUFZ1xuSW7VqRWRkJDNnzmTEiBEGop7SBWFle0y1BrjudsbKdXc7K5JKmcJ/89V6ghw3sHbtWt59911yc3N1y/Lnz5/H2dnZ6DxVRalUUlBQoGsByMvLIz8/n8LCQgoKCnT5t9r/FhYWUlRUZPDfVatWGbULWFpa0r59ezoOGsUfBca/Nywlj7CUPAB+Ox/HdxM78c34jgxbdxSAqVvO8vmz7VgxsjUACqWKb45E0KWBMw1cbY3ON2PmLG6d+Ie4uDhd7yuAh4dx83xdpjr2SkNbevFi9yCC3WxRqtXcTMxh/eFwDtzQHFdf7ZVMzahpb6bOnz+Pv3/d/fypTRwcNEWj/o1nQEAACxcuZMGCBbU1rFpHECw93IjU93MqRaBSjNtwkmPhaTXaP6JtSH5Y7V7yihS0WLJX10/UJciZn6Z0Lfcx3x6N4NN/bnJu0QA2HInggz3XdfssJCLOL3qU3ZcSmH8nYUEEXF4yULeklJWVxcqVK1mxYgXFxcVkZ2cbGfHWFmKxWPflExgYyMKFC3nuueeQyWRcic9i6JojFZ7j2Y5+vP9UK/quPEh4ap5ue6CLHDc7GZGp+aTkFnHyzX4kZBXqCk8t8d++QklyhNF5LSws8PX1xc3NDS8vLwICAggODqZJkya0bNkSLy+ve7z6mkX7fuvRyJUXHgnkXHSmgb1S5yAXA3ulCV0DWfpEc/69nsT+a8nILMSMbOdLM28HXvrhLHuvJD7077eqUJEaXpWTQrB1AV/Oe45GJmJh6zuxsbE0bdqU3Nxco33z5s1jxYoVtTCquoW+UE6EGrWR/fldtIIlQShX+wgFZR0gJj2f/p8eoqgG80ZlUjH7Zvd6qN9cvVYc0BneOskt6BhoPFtYusf0RlIOm57vSFMve/quPEhesWaJ++kOfnw0ohUTNp7i0E2NpU6Ai5xD8/oYnTM5OZnr16/Ts6dxAk9toFarcXV1xcvLi0WLFjFy5EiDJcTSxXdZvPBIIIsfb86Ta49wMTbL5DEN3W3ZN7sXaw/cZsXfN3TbRcCCkDTeen0eKSmGlkS2traIxWLy8/NNtg6ApuiUy+XY29vrrsXPz48GDRrQpEkTWrRoQWBg4D332l28eJHBgwczf/58ZsyYYbTUeisphwGrDpf5eLEIds3ojkwqod+nhwDYP7cX2QUKgwLbViblxJv9OB6WyuTvz+q275vd02yFE5VRw2uRiECpRviSN8GoUaP45ZdfjLb7+voSGRkptAfoERqdSt8pb2PTsCMiO/d6KVh6mBCWvOsAQkOyafQNb6vSY7ri7xv8NvURtk3pytZT0Xg6WDG5RwMO30zRFZPlGd66u7vj7l53zHBFIhFxcXHIZDKT1iul0yZcbCxJKyVakopFPNXOl4JiJbeSjWdGNL8H3hzchPxiBVtOGtpx+LvImfz8UJ4bPYp3332Xjz76SNcrunDhQubPnw9oesHi4uIIDQ3l+vXrhIWFER0dTUJCAqmpqWRlZZGUlMT58+dNjkEqlWJlZYW9vT0uLi54eHjg5+dHUFAQjRs3pnnz5jRp0qRMBf6ZM2dISEhg1qxZbNq0iW+//Za2bdvq9lfVXgk0ucIRejO6oEm5yi9SUKinkjdne6Wqq+E1/xXU8MYsXboUe3t7vv32W4PtNjY2QjF5h1WrVmFvb8+mTZtI/e8/xOd/JTw6rl4Klh4mhL9GHUFoSDamOv2loBGcjN1wkjcGNWHRY83ILVKw7UwMH+ktgdf1/tLSVJRmpF98vze8JbYyKaci00nMKsTNTsawNj40dLflnd1Xyb8za7v4sWbIpGKuJmQjlYh5srU3rX0dmfvLReKz7tou6Rff1tbWLF++nDFjxvDiiy9y4sQJgz45sViMn58ffn5+DBkypNwxp6amcunSJa5fv87t27eJiooiPj6elJQUMjMzuXnzJpcvXzYpcBKLxVhZWWFnZ4ezszPu7u74+voSGxur6+8MDQ2lQ4cOzJo1i2XLlmFjY1NleyWAE+HpDG7hyYSugfx7LQmZhZgJXQOxs7Jg47G7LQDmaq8kqOFrlmbNmvH111+zadMmVCoVnp6etGvXrkb6tc0BlUrFa6+9ZrDakZ6ezsF9e+nXr1+tJbsJVIyw5F3H0J8JEBqShf7SyqK/lPt4Ky+e7uBHE087HOWW5BUpCI3LYvPxSPZduys2GdnOl4ndAglwsUGlVnMxNou1B24b2AhpMbWUq1KpOHz4MI888ohRbGZNkpubS2hoKFevXuX27dtERkYSFxdHcnIyGRkZ5OTkUFRUVKbHKWgK0EGPD+NK0xegVD/W8mEtjOyV3vztEtmFmi80FxtLPnumLd0b3k2BScstMpk1XLovFzQtC8eOHePEiRPMnj37obLQ+el0dI2unHz4VEuz+ny6F2QyGQqFgri4ODw9PWt7OHUKLy8vEhMTjbbPmTOHlStX1sKIBCqDUFDWQfR7lSqboGCuvUpCf2nlqe/Fd3FxMYMHD2b//v26bSKRCLVajVQqpWHH3hT0mmX0uGA3GzztrXT2SiUKNQv/CCU1V9M2ILeU8MagJsgtJfx7PRlbmZSJ3YJwsbFk1FfHjfxhd7/SnebeDmRkZPD999+zbt06btzQ9KNGREQQGBh4356DmkT73vN3lldKDR/5/tAyz/XfrRTGfXvKbN97FVFaDe9mBT4erixZsoS33nqrtodXp9i4cSMTJ0402m5lZcWZM2do3ty8VgDMCaGgrMM069KXRLtGtBgwmpiM+pmgAMIsSWURim/o0KEDZ89qRDIODg6MHz+eiRMn0qZNG85HZzC8lLepKb6b2Al7KwudCGfT8x1RqNS8+N3d4AEHawsOzuvN0dupzNhq2A/6hNUNLvz7O8ePHzcSKWVnZxskHNVlqqqGH9bGOPCgla8DE7sF8d5f1/jqv/CH6gblXqlIDW+lzOWJ9sG82DtEUMPr0bp1ay5dumS0/dlnn+XHH3+shREJVBahh7KOkZycTF5eHn/++SfXTh4ADrD5qzdw9/artw3JQn9p5RDEXeh60SZPnswTTzyBTCbT7TNldm+K/4Um8P5TrWjgakOJUkXvEHfe+M3wCy6roIQzkem0D3Ayevz6dZ+btFcCaNSokS7P3t3dHS8vL3x9fQkMDKRhw4aEhITg5GR8zppGoVCwcuVKRo4cSXBwsNH+W0k5/Hc7FYCDN1I4eMNQ2b/5eCS7ZnTnxe4NdAXl7xfijM7TpYEzKpWanRc1mfFKlZr/bqdyOznHbG+CK5sNXyCx5ZdLyWy7kGS2K0zV4eDBg3z11Ve88cYbBttTU1NraUQClaV+VCQPERMmTGDPnj0G2/755x+mTJlSbxMUQDC8rSz1vfj+6quvytwX6GKDCCq0V9LGc9pZSZGINf2WEhPqeqlEjFRsuF0EbP78Y5YsfJObNw3/BhKJBLVaTVxcHOHh4WVaLIFG7S6TybCxscHe3h5nZ2edz6e2AA0ODqZx48bVciQ4e/Ysb7zxBosWLeKtt95i/vz5BmKH6qjhS2MpETO4hRcnI9JJzDYUeQlqeAz2C2r4uzg5OTF79mxdQblw4ULc3d1p1EgQdNV1hIKyjiGXG9+hvvTSS+zatYudO3fWwojqDs909KdbsKvu7h+1CkRlzzppvxAfaeBSr+7+heLbNNWxV7KykKBUqXmslTdbTkXrjvO0t6JjoDNnItMNHu/vIufZUUN5ZuRwtm7dyquvvkp6ejoqlYqmTZsSGmo4e5yens6NGzcICwsjMjKS2NhYndI9PT2drKwsEhMTiYyMLLcAlUgkugLUzs4OJycngwJUazbfuHFjPD09dV6iJSUlLF26lI0bN7J+/XoGDRoEUC01fGn6hLjhYG1hNHMpqOGNqe9q+NI9pr4OMiQSCSEhIbUaEyxQNYSCsg4RHh5uNDupRVABavBzlvP9pM5s/v1vZq/9FddWvSixdKi3/aVlUbr4rqy4y9yL76raK+UXK9l+JoZnO/nz44ud2XMlEVtLKc91CcBKKmbdwTDdufXtlUQiEWPGjGHo0KEsWrSIzz//HD8/P6PxODs707VrV7p2LT8FSktWVhY3b94kLCyMiIgIYmJiSEhIIDk5mbS0NLKyskhJSSEmJgaFQlFmpry+n6larSYqKorBgwfj5+fHawsWEZXubfSYhUObGqnh3/7jcpljfbKND0UlSv532bjojE7LJ69IYaSG379/P7///jtvvfXWQ/WZJ2TDV53yekwBPF78gu7tgriVlCP0mD4kCKKcOsTmzZt5/vnnjbaLRCJyc3NNzl7WJwoLCzl16hR2dnY88sgjFBYWMmzYMH746ed6219aFpGRkVy6dInevXszcNQEwsTeNO070qQ4oD4V39WxV5KIRYzt7M/oDn4EuGiiOC/FZrJmv7HFUllJOdevX8fa2pqAgID7eHXG5Ofnc/PmTW7evElkZCQxMTHEx8dz7tw5IiMjTT7Gwj0I74lrjLZXpIbXx1Ym5cxb/Tl4I4WpW84a7Ye7avjMzEy+++47Vq9eTViYpkDfuXMnjz/+ePUv/AFSVTU8aEIExnbyZ0wnfxq42VJQouRaQjbv7LrKtcSch04MVxWqlLhk5i4m5oZQUNYh1Go1YWFhNGvWjJKSEoN9t27domHDhrU0srrBzp07efLJJw22tWrVinPnzgkJE6WYM2cOn376qc7kWyKRcP36dbz8Aut98V3f7ZVAkxn96aef6mYwZTIZzz77LJMmTaLAxpMXt12v4AzGanh9RrX3ZcXI1kz94Sx7rhj7CQI8aX2Tk39t4+zZs0bL+UeOHKFbt27VuLKaRa1Wk5GRUa7peFXV8AAfj2zFk218+O1cHOeiM5BbSmjubc/vF+I5cqfQepheT5XlXn2WhR7Tuk39+iap44hEIho2bIiPjw+RkZHY29vzyy+/kJmZSVBQUG0Pr9bx8PAw2nbp0iXc3Nw4cuQIzZo1q4VR1U20Nx9as2+lUkmjRo1o27Ytp06dKjO6sD7w3vCW9P/0UI0WlFKxiPeGt6yx891vCgoKUKlUNGvWjOnTpzN27FgcHDQCmyvxpnPeS6Ovhg8vFU35ZBsfsgtK2F9qZk6fL9auKVMN36dPH6ytrbG2tsbW1hYHBwecnJxwdXXVqeN9fHzw9/cnKCgIHx+f+/Ka3r9/P/3792f8+PF8+OGHRsvw1VHDD23pxcj2frz0/Rn2moiTBfNUwws9puZP/f1WqcNokzQOHz5M69ata3k0dQOVSsWCBQtM7hOJRLi6uprcJ2CIu7t7vS4mQbBXAli0aBEvvvgibdq0McqHr44aXh83OxldG7jwy9lYipWmPVFFwKl/d/PO4oXs2LEDwKDfMyQkhIKCAnJzc0lOTtb1hJaXhiQSiZBKpVhaWmJtba1TyDs5OeHi4oKbmxseHh74+Pjg5+dHQEAAQUFB5bYShYeHA7BlyxZ++eUX3nnnHV555RUsLCw026uhhn+xexAXYjLYezUJkQispBIKSpRGjzUnNbzQY1o/qN/fLHWE0go3R1cPhrVqJRSTeuTm5po0uwV4/fXXq2WdYq5cuHCB119/3Wh7cHAwv/76ay2MqO5R3+2VPD09yxS9VEcNr88TrbyRiEUmfSm1+LvIadOiKb/++iuXL19m+vTpHD58WLf/7NmzJuM8VSoVycnJREREEB0dTWxsrE6UpK+Mz8nJITMzk6SkJEpKSlAqjQs2fSQSCZaWllhZWWFjY4OtrS2Ojo5kZGQgEolQKpXk5+czd+5cVq1axapVqxg+fHiV1fC2MimtfR35/mQUrz0awoRHArGVSYlOz+fDPdfZraeaL0sNr1arOXHiBHv37mX+/PlYW1uXe221TUx6Pot3XqGRu22lekw/HtmKke2NBWxhybn0+/QQAG/vvMIjwa4P1U1cfUAoKGuJchVufRcgtZGyZOcVxnb2FxRugL29PfHx8YwePVo3o6GloKCglkZVN5k6dSp5eXlG2x9//HFsbGxqYUR1E8FeqWyqqobX58k23iRmFXIiwjgTHgzV8AAtWrTg4MGD/Pzzz7z66quUlJSUmQ0vFot1xXBllfFasrOziYyM1NkzxcXFkZSUREpKCmlpaWRmZpKdnU1+fj7p6encvn3bpFVTTEwMI0aMQGpli8+rWzUKGz3KU8MHOMsRi0U83sobpUrFB/+7RnahgondAlnzTFtyixQcunl32VxfDV9QUMDWrVtZtWqVzn5qyJAhdOrUqUrPw4NmwY5QFCo1Pk7W2Mok/Hou1qDHdMOEjkY9pkUlSuaXWkHIKbyrK1Co1CzYEWp2PaYPO4Io5wEjKNzuja+//popU6YAmsxXR0dHOnbsiI+PcexbfSU0NJTvvvuOzz77zEDcNWjQIP73v//V4sjqJvrvSZFahboS3qbm/p6sjhoeoIGrDfvn9ubr/8JZ/te1Ms9flhpeW8z5+vrW7AVVk8mTJ7Np0yYUCoUuF97a2prmzZvTa9hYfsk17uUrTw3fMdCJn196BIBh645yISYT0OTF//daH8JT8xj15XGD881omMPJPb/yv//9j7y8PN04AG7cuEHjxo3v75NQDsXFxfzzzz88+uijujYAffRfR6YQi2DXjO7IpBLd7OPHI1sxuIUXzZfsrfD3l/U6EqgdhBnKB4iQonDvaNXcY8aMMWmxVF8xaJtw8WfJu++zY8cOwsLCePvttzl69CjNmz/8vVj3A6236S9/H2HKiu8J7v4EqYXUa3ulRh529GjoyrHwNP68lMCfl8o2MNcnPDWPwDd3l7lfq14u6/mTy+V1yh4tPT1dN0vZpUsXXnnlFUaMGIGlpSXnozP4xUQ2fFhKHmEpmhWC387H8d3ETnwzviPD1h2lsETTAxqdnq8rJgHyi5X8ez2ZYW18jCYa3lq0mOKEu60Z+nNA7du3x8bGRmdor431dHFxwcPDA09PT7y9vfHz88Pf3x93d3ddj35NsHv3bp566ikaNmzI559/zsCBAw3230viklgEckspuUWmDf3NqcfUXBAKygeEoHCrHqX7S2MTU7Czs2Pz5s21PbRap7y2CRGgHryQ3rJ8nps2jqVLl9bWMOs0cXFxnDhxgi5dujDlmSfIyMjgrx/fRW7vVO/tlQQ1PDzxxBN4enoyZcoUo5726mTDJ92JoEzNLTI6Li23CEupGLmFhBy9Iuq9d5ex4eOlXLtmPOPr5uZGfn4+qampxMXFUVJSUq5wCQzFS1ZWVsjlcuzs7AwETK6urrpi1Nvbm4CAAPz9/Y1aEZKTNTPU4eHhDBo0iKFDh7Jq1Sqdy0R1E5esLSRcXjIQuaWUzPxidl6M54M91w3aK8w1celhpn59QtYSgsKtapSfoNCChrN+4N2/btTb/tLKtE2oAWzdiBbBgFWHzX6Jtrp8++23vP322wbb/v77b8aMGUNz77JzqusDghoeJkyYwIQJE0zuq44aPjw1j+TsQjzsrYyOc7e3orBESW7x3WJSBEwdO4K5E0fz119/8corrxAREYFarcbKykqnQi9Nbm4uUVFRREdHEx8fT0JCAklJSaSmphr0i+bm5pKbm0tqaqpOvFRRF5xEIsHCwgKZTKYrXrX//euvv/jrr7/o1q0bry9YRHR6idHjK0pcSs4p4svDYVyOz0Ysgl6N3RjfNZCmXvY88/UJg887U4lLArWH0EN5n9GmKBQpDO8ap/duyGsDQ7iRmMPAz+72mIhEMKajP2M7+xPgYkN+sZIr8Vms3n+bc9EZAGaboiD0l1aMYAxcs2zZsoXnnnvOaHvjxo05d+6cIGLi3lZX9Hnt0RCm9zGvcIZeKw5UqIbfMa0bDd1sab/8H/KLlbz9WDMmdgviuQ0nOXLHw9JJbsGh1/pwJjKDiZtP6x4f4CLn0Lw+up+Li4tZvXo1ixcvxtXVlaioqBq/JoVCQVxcHDExMbpkpaSkJF28Z0ZGhk5Jn5ycXKYosiYSl7RM6x3M6wOb8MrWc0btF9rEJYHaRygo7zOmUjk87a3YP7cXajXEZhQYFJRvDWnK5B4N+O18LKcj0rG3tmBMJ3+8Ha0Zuf4YF2OzzDJFQSiUKqamvtjnPdq4XrVNlIVarWb06NH8/PPPRvs6d+7MsWPHarTf7GHmXt+f5qqGX7Lzik4N/+Vz7ctVw284ojFxd7W1ZPcrPZBbSthwJIKcQgVjOvvj7WDNU18c5VpiDqB57sZ1DjDZI5icnExWVhaNGtXu+/ill15iw4YNKJVKJBIJKpWK/v37M3LkSFxCOjB3T8W9t+UlLmmRScVcXTqIn8/GGM2Y73j5Edr6O93ztQjcO8I88X1EP0VBn7eGNOV8dCYSsQgn+d2eFIlYxHOdA9gdmsCc7Rd123eHJnDk9b4Ma+PDxdgss0tREPpLK0Zom6h5vvrqK5PFpLW1NXv27BGKST2e6ehPt2BX3QqCWKQRVJSFdgXhkQYuZr2CMLazP5uORwKw61I8T3fw47nO/gZq+A/2XDNQw6fmFjNy/THeGtKMid2DsBCLORedweztF3TFJGg+257rYvo96u7uXie8d7Ozs1Eqldjb2/PSSy/x8ssv61LdrsRnQSUKyvISl7QUKVRk5BfjaG1sJ1XZXlaB+49QUN5HTCncOgU6M7iFJ0PXHGFpqTtPqViEtaXEqGE7LbcYpUpNoV6agrko3IRCqWK0xsCmKKt1AsBCImJyjwaMaOuLr5M12YWaL7gFO0IFY2CgdevW9O7dm4MHDxpsF4vFuhhCgbto1fC3knJ4bPaH4NWcYkt7QQ1fDTV8TEYBU7ecLXN/RWr4usLcuXMZOnQoI0aMMDJYv9fEJX1sLCU4yy1JzzP8bhTd+T0CdQOhoLyPlFa4iUWw9InmbDsTw42kHKPjixQqzkdnMLKdL+eiM3RL3q/0bURWQQk/norWHVuWwu3ChQusXbuW7t27l9lMXlcoq1AyVST5OlpzZH7fMs+19VQ0b5ppoaQ1Bi6Np70V0/sEk2fCVkMqFvHthI60D3Dip9MxXEvIxsHagjZ+jthZSUnJLar3xsBdunThwIEDtGvXjvPnzyOVSrGxsaGgoIDi4mJkMlltD7FOoVAokEqlHN61nZtblzNs2DB++OlnQQ1fj9XwHTp0oEOHDib3VSdxSSYVIxWLyCtllv9K30aIxSID03fQ3LzUt9dbXUb4S9wncosURN95I2kZ2zkAH0drxm44WebjZm2/wOfPtuOz0W1126LS8hi5/hgxGYbNz1qFm0wCf/zxB5988gnHjml80bKzs+t8QWmqUCqrSErLK2bWtgtG5+jV2I3hbX3475bmg8bcEhTKapuAslsnACZ1D6JzkAujvtT03ZrCnNomKktpGyr92Y3z58/TtGlTcnNzhWKyFJGRkTRq1Ahvb29iYjSJJjKZDBuZtN4LIgQ1fNlUNXHJ19Ga3TN7sPNiPGEpmkjPno3c6NvEnYM3kvn7WpLu3KUTlwRqH6GgvE9EpeUZTPU7yi2YM6Axq/ffIj2vbDVbXpGCm0k5nIvO4NjtVNzsZEztFcxX4zow6stjZOTftWFQA0NGT+Diwd1kZWUhuhMBJpFIsLe3v09XVjnmzZvH6dOnWblypck72Kr2lxaUKE1mA49s70t2YYkuC9bc+kvLMgYur3VCJIIXHgni76uJOhGXhUSkM1XWYi5tExVRkV+nqMcsHumejswtAIlEIix3m8DW1haFQkF09N1Vku3bt5Obm8vKlSsJCQmpxdHVPvU9G74sqtpjqvksT6J7Q1dGtPNBIhIRmZbPR3uu89V/4ehLiMvrMRWoHYSC8j5RXMomaN6AEDLzS9h8581lColYxA+TOnMiPJ0lf95dCj5yO5W/Z/XipZ7BfLDnusFjTpw6Q3GWZgZKK9hXKpV88803bNiwAalUilQqRSaTYWVlhbW1NTY2Ntja2uLg4ICDg4POzNbNzQ03NzddVq6Pjw/29vbVEiccPnyY06dP07FjR8aPH8/777+Pt7e3bn9V+0tN4WYno2sDF347F2tgy2SqUFKr1fz7778sXbqUTp06sXLlyipf0/1g06ZNvPXWW8yZM4epU6ca2dSYMgauqHWikbstng5WXEvI4b3hLRnRzgeZVMK1hGyW7brK8XBNxrK5GwNX1q9TLXchUeQi+HWWQ0FBAWKx2MA0W61Ws3v3bqZNm1bvC0oQsuFNUdUe0+xChYEgtSwelh7T+oZQUN4n9JVngS5ynu3kz7JdV/Gwu2toK5OKkUpE+Dpak1OkoJmXPU087Xl3t2EiQmRaPmEpubQPMLZGeG3ubL7+aLEusQA0SQhNmjTBx8dHZ16bl5dHQUEB6enpJCQkoFAoKmViqz2fRCIxSFewtrZGLpdja2uLvb29rjB1dnbG1dXVYCZjy5YtbN++nbfeeou5c+dibW1d5f5SUzzRyhuJWGQ0c6lfKKnVavbv38+iRYs4fvy47nrqCmFhYcTHx/Paa6+xfPly3nzzTaZNm4aNjY3JtgmouHUi6M4y7qTuQWQWFPPWDo1p8LQ+wWx6oSNPrj3K9TtqUnM1Bq5yzOmd3ULMqTGFhYX069fPZALL7NmzGTJkSC2Mqm5SWg1f2Wx4c1bD1+ce0/qGeX2L1CH0FW6e9lZI7nglmpp5OzK/L98ejdBlu0rExgWP9M4drD4i4M0ZL/L2KxP5/PPPWbx4MQUFBahUKl588UXmzJlT4TjVajVZWVnExcWRmJhIYmIiycnJpKamkp6eTkZGhkGqQl5eHvn5+WRlZZGSkqJLVygv7kupVKJUKlm0aBGLFi2iacu25A9dducKNFSmv7Q0T7bxJim7kGN3Ztz0iUrL54OVn7Lp6y+5ceOGQRGZkpLC9u3bddcPGCU+lN6u/VmtVhv8K+/Yin4GOHXqFBKJBKVSSUZGBq+//jqLFy+mX79+PDZuqpFCsjKtE/I7xaGNTMLQNSdJyNLEvR0LS+XgvD681DOY2dsvaMYCRKbl6frgVCoVR44cYdOmTfzvf/9j165dtG/f3uTvqasINlQ1S35+vlHknpYePXo84NHUfbRq+IuRyfR7aTG2jTsjsnWrt2p4oce0/iAUlPcJfYXbjaQcpnx/xuiYuQNCsJFJWLbrKlFp+VhINEXP4628DNRszb3taeBmy1Y9lTcYKtzmzJnDuHHjWLRoEV9//TUBAQGVGqdIJMLR0RFHR0eaN7+3pc/8/HwSEhJISEhgwIABFBYWGuy3sLCgcePGdOg3hIN6xWRl+0v1CXK1oZWvI98cMeyr0eftj9ZQkqwxE9Yv4q5fv87o0aOreHUPjoKCAnbt2sXfZ2/iNeETg32VaZ3Q2kudjcrQFZMA8VmFnIlKN5rpLlaoCA8P57vvvuPbb78lJiZGt7yZnZ1dcxf2ABBsqGoeZ2dnLl++zJdffsnUqVMBdDdB9yOp5WHn9ddfx9LSkl27dpF28SKyyzu5GR5Vr9XwQo9p/aD+vKJrAa3CLSO/hL+vJhntn9gtCLA02Hf4Vgoj2/thK7Pgv1spuNvLmNA1kMISJd8ejdAdZ0rh5ubmxvr16/noo4+wtbW9b9dVFnK5nODgYBo0aEBRUREikQi1Wk3Lli2ZO3cuo0ePxsrKivPRGRz84pjucZUpkkozrI2mH/P388ZCHS3jJrzA31u/IjY2VjcWgEaNGvHWW28Bd5e/tX2ipX/W7x8ViUQG/8rbZuocph7z3Xff8dNPP6FUKnVj9PX15cUXX6TzoBFM/f3uF3ZlWyeSsjVebaX9TEHjaVpaldv9kS7kxxl+0GtnU9PT0yksLMTKyjh7uK5RHb/OnyZ3oUsDF6PjD91MZsLG02ZpQ1VdunTpAmhMtW/fvs3ly5fv+SbU3FCr1axbt468vLsG3YmJiaz+ZAXjxo3D19+3FkdXuwg9puaPUFDeR/QVbpVl8ndnmNKzAY+38qZXYzdKlCpORabzyT83DVIEylO41bbCW61W06pVKxo0aMDs2bPp3r27wZJzdfpLswpKDH7HE619CEvO5XJ82TNoc2bN5JsPF7J7924WLVrEhQsXAM0XYl2xVDp69ChKpWZGsWHDhrzzzjuMHDkSiURCXpEC0e9RuqWyyrZOrPz7BsUKFR72xkWgu72MNANzYDXB7vaEllGXjxw5EtAUxdbW1tjb2+Pm5oaPjw+BgYGEhITQokUL2rZti7Oz8708FRWi9UEsi+r4dQLEZxbw0d4bBtuSsjUzu+ZmQ1UVSlssXblxG4B//vkHOzs7unbtWssjrHuIRCI8PT0JCwvTbVOpVCxYsIDbt2+zYcOGWhxd7VO6x1Qiutu/bIr60GNqTggF5X1EX+Fm6m7sma9PGG0rUqhYs/82a/bfLvO8dV3hJhaLdcWbKarTX7ps11XdtjZ+jgS52rDynxtGx2vRJiiIRCIee+wxhg4dyl9//cXSpUtp3bp19S+uhmnTpg0dOnRgzpw5PP3000gkEt2+0sbAlW2dyCtWcvBGMn2buBPsZkNYiuZGJNjNlvb+TgYG+QEuNhw6d5qrV68yceJETp6828NqbW3N/PnzuX37NtHR0SQkJJCens6NGze4dOmS0ThEIhEymQw7OztcXFzw8vLC39+fRo0a0aJFC9q0aYOfn1+1XAPy8/Px8vKiZ8+erF+/Hh8fH4P91fXrBMgpVJi0pALzs6GqiPIslsCKkLlb+S1SgrVHDo08zP/5qCrbtm0zKCa1ODg4sGzZsloYUd1DP3Fp8Q/7OHQzFUtn73rbY2pOiNSVkfkKVJuY9Hz6f3rIwNbmXpFJxeyb3euhvlvrteIAUen5OMkt6BhoPLNVukjSV34vfqwZL3QLoueKAyZV0AABLnIOzetz38b/oFiy84rOGLgsfprcBSe5pcFSbkN3W36f1o28IgWbjkUC8PwjgUjEIoau+Y+k7CIkYhHjOgfo7JVUKhVffPEFr732GgUFBYSEhHD9+nVTvxLQLOWdP3+eK1eucPPmTSIjI0lISCA1NZWsrCyKiopMirUsLCywtbXFyckJDw8P/P39CQ4OpmnTprRp04YmTZoYzURev36dpk2bIhKJkMvlrFy5ksmTJ+uK07Kep06Bzvz4YmedFVXp50n73A1Z8x8yqZj8UgkdgNHzZI5UxmJJi3a/YLFkTIcOHTh71jhSccyYMWzZsqUWRlR3USgUuLi4kJOTQ05Bcb3uMTUXhL/YfUZQuJmmOv2loLEXeqyVF+eiM8osJs0pQaE6bRMAt5NzGf3Vcd4Y1IQZfRqiUqs5HpbGe/+7puuxLN02IRaLmT59Ok888QQzZ86kcePG5f4OT09PBg8ezODBg8s8Jjc3lwsXLhAaGsr169eJjIwkNjaW5ORkUlJSiIqK0tk56SORSJDL5Tg6OuLu7q5TGavVavLy8pg6dSrff/89GzZsICQkpFp+nVqCXG24unQgMqmElJxCtp6OYfW/twwsh8zZr7PKFkt39gsWS8bs2bOHbdu2MWPGDIPtkZGRtTOgOsj333/PgQMHiIqK0on+stKSaa7nUyzwcCIUlA8AQeFmTHULpe4NXXGzs+LzA8bLSlrMKUGhorYJMN06AXAlPptx354yua+8tgk/Pz927NhR/UHrYWtrS/fu3enevXuZxygUCq5evcrFixe5du0at2/fJjY2lqSkJNLT00lMTKSkpMTocUePHqVJkyYmbaigclZUUWn5HA9P43piDnJLCUNaeDKzbyMauNowY+t53XFl+XVmZmayb98+Bg0aVCtCuHtFsFiqWVxdXZk+fTqvvvoqSqWSDz74AGdnZ3x9668YpzT79u3ju+++M9j21FNPMXPmTMaMGVNLoxKoCYQl7weI/kyAoHCDcRtOllsoVQdtoWROIgqhbQKWL1/OkiVLUCg0whqtIt7S0pKGHXuT12OmwfGOcgsOzO3N2gO3+eaIxh3BVGuAKd4b3pIxnfwZvu4o5+94wwLsfqU7zb0dUKvVHD9+nC+//JJt27ZRVFTEr7/+ylNPPVWzF32f+el0dI2unHz4VEuz+nyqCgYCJomYzi0a4O/lwdWrVyt+cD1j9uzZrFq1ymi7u7s7iYmJdSp4QqBqCDOUD5DSCjfUKqjHKQpCgkLlENomIC4uTldMOjg4MH78eJ5//nnatm3LhZhMhuvZUEH1rKi0fPNfOGM6+dOtoatBQXni1Bl+OLmPX3/9lVu3biGVSg3G9DBRlsVSWfZK+thbSdk/tzeutjJe3nKW/11OBKh3FkvlCZhcXtqMjbWIJTuvMLazvyBgusPt27f5+uuvTe7bvn27UEw+5AgF5QPGz1nOc76ZbJv/Ms2efAmHpo8QnZZfLxVuQqFUeep720S3bt1ITk7mueeeY8iQIQbJLfo2VFB9Kyot8VkFgGaWU5+XX5qsM8oHdMUkwMsvv4yvry+enp74+voSGBhIcHAwTZo0qbayvbqkpaWRnp5Oo0ZlL0GbsliqyF5Jy+wBjbG2kBhtry8WS5URMIlEIlIK4fuTUWw6HikImO5w/vx5A49OLSKRiLZt29bCiARqEmHJ+wGhVqvJzs4mPDycLl26UFxczMiRI/n555+N/N7qm8LtXvq49Hnt0RCm92lYAyOquwhtE8bkFSlosWSv7qasS5AzP00p3yOxtBWVPo09bPl7Vi8+2nOddYc0vboi4LWgRD54dykxMTFGj5HJZJSUlJQZQSoWi5HJZMjlcuzt7XF2dsbNzU1nrRQYGEjDhg1p0qQJrq6ulb52U8yYMYN169YxdepU3nvvPRwdHQ3230rKYcAq49nHNc+0xdnGUmevZGqGsrGHLbtf6cHq/beYOyDEYIZSy77ZPc32Jvhe33+CgAlSU1N59NFHOX9e06OsbV+5cOFCnbJ0E6g69adqqWW++OILpk+frossA40CFjR+g6XTS+oTQoJC5SndNiFSq1DX47YJqL5fp61MSrFCRbHSsAh85Y645NCtu/Gn/i5ypk2ZxMuTJ7J161ZmzpxJZmamLuEoNzdXtwQeERHBjRs3CAsLIzo6mri4OBITE0lNTSUzM5O0tDTi4uIoKSmhrPt5qVSKTCbD1tYWBwcHXFxccHd3x9vbG39/fxo0aEDjxo1p3Lgxcrnh3zQqKgq1Ws1XX33Ftm3b+Oyzzxg7dqxuOXHLyWijmbVOgc4MbuGps1cqi8WPNWfvlUROR6Sb3C8Ri/jhRLRZWiwJAqaawdXVleDgYM6fP0/z5s05duwY0dHRNGvWrLaHJnCPCAXlA0JbPGqLSdAkTixbtoy33nrLwNC6PlK6UFKrlIjEZT8n9aFQKo1arebnn3+mffv2fDDIl0btn6XLuNdQejSpt20TWrQ2VEqVutJWVF2CnFn9TFt2XoonMi0fK6mYgc096RjozI8no7hyJ4VJ34ZKJBIxZswYhgwZwsKFC1m3bh1OTk4630ypVEqjRo3KXW7WJz8/n5s3b3Lz5k3CwsKIiYkhPj6epKQk0tLSyM7OJi4ujvDwcIMldn1EIhEWFhZYWVlhZ2dHWloaoPmsSU9PZ9y4cbz//vt89tln9O3b18hiqbL2SkNaeNI+wIn+nxzC18na5DHlWSwlJyeTk5NDcHBwpZ6buoSQEX9vlF6F8/QNQCQS8e+//2Jvb0+LFi1qe4gCNYBQUD4A0tPTWbFihdF2ra3ErFmzaj0usS7g5yxnaR83mswfhWvX4TTqNazeF0r6xMXFMXr0aADdbFhPmySWzHu53rdNVMeGKjazgFOR6Qxs5ombnQyVWs3t5FwW7Ag1SBMyZUPl6OjI559/zqRJk0hNNZ3QUxnkcjlt2rShTZs2lTo+OTmZmzdvcuvWLSIiIoiNjSUhIYGUlBTS09PJzs6msLDQ6HFXr15lwIABiGVy/GZvQ99iqTL2SjKpmAVDmrLhSASxmQVlFpRgaLGkVqs5cuQIa9eu5ddff8Xf399kkkxdpqoCpmm9gxnQ1AN/Zzm2MinxWYUcuJHM5wduk55XDNQPAVO5qUuy3gTPassXJ1MZ21kuiJbMhPrzjVOL5OfnY29vb/KLZ/Xq1UIxiWb2LTY2li5dulCSloLy1E8c+vOzel8o6ePi4qL7f+1s1fLlywkLC+OTTz6hubdbbQ2t1qmOX2dsRoGB16QpKoo5fdBCAnd3d9zd3cv19bS2ttYVlWKxGJVKRZMmTejatSsBbbqxMeFuMekot2DOgMas3n9LV+yYYlrvYCwkYtYeLDsSVosauBKdzJl/fmf16tXcuHFDdwP0MK7EVFXA1NLHgasJ2fx5KZ7cIiUN3Wx5ppMffULcGbL6PwpKlGYtYKpU6pJIRInMURAtmRn185v5AePr68vt27dxd3c3KiqdnJxqaVR1h5MnT9KrVy9EIpHuizAnJwe1Wl3v+0v1iY6O1jWwa1EoFPzwww9MnDiRPn0e/qjJe0GwoYKCggLde8jNzY0pU6YwadIkgoKCADgfncFGPYulytgr+TpaM6VHMG/vvGwymtIUPXr1oTjh7hKx9gYoKSmJUaNG6fpB/fz8dD2hvr6+D1QNr1ar+eCDD+jSpUuZ752yMuLLy4d/ecs5o+PPRWew/rn29G/qzp+XEsw2I15IXarfCAXlA0IkEuHt7U1qaioikYiNGzcik8kYMGBAbQ+t1snOzqaoqMhgW0FBAXPnzuW9997DysqqjEfWHy5cuEDfvn1Nijg2btxY74tJEGyoQDM7+dFHH9GoUSOGDh2KhYWh9ZG+xVJl7ZVmD2hMYnYhx8PT8HXULHW72ckAcLGxxNfRmrisAvRfmt6e7kQmGPccZmdn88svv5Q5fm0/qFYRb2dnpxMlubq64unpqStEg4KCaNCggcHMfVVIT09nwYIFAIwcOZJPPvkEPz8/g2PuRcCkT2yGRjBmb3X372FuAiZBtCQg2AY9QIKDgwkPD+eHH35g7NixtT2cOoFaraZDhw6cO2d8Vw9w6tQpOnbs+IBHVfd4/fXXTfbhtm3btsznrr4i2FCVjb7FUmXtlZp52dOlQflFW6ule8kuvJNiBFxeMpAbVy7x8ssvc+rUKUQiEWKxmOeff56vvvqK1NRUwsLCdNnu8fHxOiV8eno6mZmZ5Obmkp+fT1FREQqFokxFPGiW9i0tLbGyssLGxgY7OzucnJxwdnbG3d0dLy8vfHx8DArR2NhYQkJCAE12vIWFBYsXL2b27NnIZJqCudeKAzr3ANAImHa/0oNz0Rm89fvlctOXnOQWSMViAl3lzB/YhDZ+jgz87DBhKXd9GANc5Bya9/DfDAqpSwIgzFDeN0z1/llbW9O9e3ehmNRDrVbTuHFjk0XR448/LhSTd3jvvffo27cvzz33nE7FC1BcXHbfW31FsKEqG32LpcraK9lZSXG2MVzWbexhx7xHQ1h/KIxz0RkGS+H+LnJsZFLatWvH8ePH+f7775kzZw7p6ek4OzsjFot1vaBdu5Zf0OqjUCiIiYkhPDycqKgonSApOTmZ1NRUMjIyyM7OJjc3l4yMDG7fvl2mMr40SqUSpVLJm2++yZIlS3j66acZ8uRTRKcbzvBWRsAE4GYr4/Rb/XU/x2cW8Oq2CwbFJBhnxGdkZLB582Y2bdrEwoULGTlyZKXGX5tURbRkZSFmVHs/BjTzoImHHXKZlKi0PLaeiubHU9Fo36r1QbRkjggFZQ1SnqpNBMgGL6RZI1duJeUIqrY7iMVitm7dSkpKCv/++6/BvoYNzWt2qCqYuiEZNGgQzs7OpKWlMW/ePP7991/c3d1re6h1EiO/TtSoKTvWrT7ZUGktliprr2SK7DspQxdjMw2O07dYAs37e8KECQwbNoy1a9fy+OOPV3vcUqmUoKAgXT9oZcnPzyciIoKIiAidL2hCQgKXL1/m9OnTRscXFRWxZcsWfj90Bucxd1cFKitgAsgsKGbsNyeQWUho7m3PoOaeyC2NBUlq0LzPk8JZu3YtP/zwA8XFxajVam7frlgAVReoimjJ31nO0sebczQslW+ORJBbpKBnIzfeHdaStv5OzP35IlB/UpfMDaGgrAEqo2pTA4VSO/ZFFbN31WFB1VaKZs2a6QrKOXPm8NRTTz2UfnX3QkU3JH7OcnJDBjPlyWdZsWJpbQ3zocHPWc4QeTjbvp7PU/M/JUHkLNhQUT2LpcpiymIJNFnn2n7FB41cLqd58+Y0b27Yq/j9998zfvx4QNO7KZPJGD9+PNOmTaN169acjUxjxJd3nQGqkg9folRzNEyzkrD/ejJHb6fx28uPkJZXzP7ryQbHdu/Zm8ywC0aCO+1Ma20KNzMyMvjuu+8YP368yXFUVbSUklPEwM8Ocys5V7ftx1PRfDSiFU938GP1/ltEpeWbrWjJ3BEKyntEULXVDCkpmlSSRx99lI8//liX6lEfqOwNSXR6PrIWA9iLiHEbTgo3JGUQGhpKRkYGYrGYcePGoVQqeWtQY1q2bCnYUFGxxVJpeyVTnIhIJ/DN3QbbKrJYqmuUlGhmWRs3bszMmTN57rnncHC46yhhZXn3dXGv+fDnojNIyi5kWBtvo4IyLycLwKhHdPny5SxfvhzQzPTqi5W0CUqOjo64urri7u6Op6enrk80MDAQPz8/I1FWVfn999+ZNWsWS5YsYcWKFUycONFAiV9V0VJGfgkZ+cbP0d4riTzdwY+GbrZEpWl6Vs1NtFQfqF+fpDWMoGqrHmX1lzo4OPDXX3/Vq2Kyqjck2mVb4YakbObMmcO+ffsMtuXkaBJgBBsqDYLFEjz77LN07NiRFi1amPzMCXSxQYTmZs7T3grJnSxuU8ruI/P7lpsPD5ri087KsMATAft+38rsGdOM+sjHjx+PXC4nOTmZtLQ0MjMzdT2iiYmJREdHlxvfCZqZV4lEgqWlJdbW1jrBkqOjI05OTri5ueHp6YmXlxe+vr4EBAQQGBiIs7MzoFHCi8ViMjMzmTx5MmvXrmX9+vV07qxZiq5u6lJptK4BGfl3WwnKS10SqJsIBWU1EaK4qkZFy7ly98H0mtOX8NT8etNfKtyQ3B8yMjKMts2ePZv169c/cCPyuopgsaSxWGrZsuwCuDoCJmsLCWrUFJYY5sMPau6Jo9ySS7FZBtv9XeT07NqZ06dPs3nzZubNm0d6uiYnfdasWZV6vapUKhITE4mMjCQmJkYnVkpKStKJlbKyssjJySE7O5uUlBSKi4sNYoBNIRaLEYlEqFR3r+XChQt06dKFoKAgZr/+JlHp3gaPqaxoSR8LiYiJ3YKITs/nYqnnp7RoSaBuI/yVqoFW1Vae7cbwdUc5H5MJwE+Tu5i03Th0M5kJGzVN4eaqaqvscm6eSM7lIhsG1JP+UuGG5P7w0UcfcfbsWaPtp06dYsWKFfz444+1MKq6yTMd/UnNLaoxiyVzfP1VVcDUzMueHyZ1ZteleMJS8lCp1bTycWBYWx9i0vPZeCxC91h9AZNYLOaFF15g+PDhLFmyhB07dhAYGFipMYrFYry9vfH29q744FLk5+cTGRlJVFSUQY68dlb08uXLBq4SWiIiIpi7+H28J67RbauKaEmfpU+0oLGHHc9vOmX0/aAVLQmrCg8HQkFZDUqr2jYejTC6s4pMM7SHiM8s4KO9Nwy2JWXfzdw1R1Wb0F9qmqrekAjZwJXn2LFjJrf7+/uzbt26Bzyauo++xVKJUkVVVsDN3WIJqi5gSsgqYM/lBB4JdmVEO1+kEhFxmQV8dzySzw/cJlOvf7CsjPhVq1axatWqGrqC8pHL5TRr1oxmzZqZ3P/MM8+wfft23Uylvb09L774IlOnTiVFZcOYTXejS6siWtIypUcDxnTy5+O/b3DwRorJY4oVKpPbBeoeQkFZRUyp2k5FpvO/y4nlPi6nUMHvF+LK3G9uqjZhObdsqnpDUt+zgavCjh07eOONN/joo48Mtg8ePBhHR8faGVQd55mO/jzSwIUec9ch8mpWdv7yHeqTxVJVBUwZ+SUs+P1yhed9WARM+fn5qNVqWrVqxauvvsro0aORyzV/7+L4u59Z1REtjWznyxuDmvDDiSg+P1C2RZJ+upNA3UYoKKuIKVUbgI2lhEKFqsIPYplUXGYerrmo2oTl3LKpzg1Jfc4GrioikcjADL9nz57k5+cbWcYI3KWwsJDRj/Un+sQJnhj3Em1HvsKBm8mCxdId6rOA6ZNPPuHtt9+mffv2RsKlexEtDWjqwQdPtWTPlUQW7Sy7ABfd+T0CDwdCQVlFSqvaAFaMbI2tTIpCqeJ0ZAbv/e8aoXGGM05BrjZcXToQmVRCSk4hW0/HsPrfWwYzVWWp2vLy8vj++++5cOECa9euRSIxNsitK1R1OVcfeysp++f2xtVWxstbzuqKLHNazr2XGxJ96kM2cGUw5RgQFhYGaPKZtct1AsZs3LiRq1evsn//fp3CuE+7Jsx6ojlLaC5YLN2hPguYyguXqI5oCTS2QmuebcupyHRmbbtAeeHP2tQlgYcD4S9VBXKLFETr5boWK9X8FZrAgRvJZOQX08jdjsk9GvDzS10Z8cUxriRkAxCVls/x8DSuJ+Ygt5QwpIUnM/s2ooGrDTO2njf4HfqqtsjISNasWcPXX3+tsz15//33a9XotiKq01+qZfaAxlhbGBfLD9Ny7qVLl9i2bRsTJ040acxe3RsSMM4GVihVnIi42zBfX2w2KkykKgmg4dNvsvyzN4RishzWrFnD+fN3P39EIhHZ2dm6nwWLpbsIAibTVFW05ONozTfjO6BWw1+XExnS0svg+OuJ2VxP1HzXlU5dEqj7CAVlFYhKyzP48joXncG0H+9alOy7lsxflxPYM7Mnrw8K0Sm45/92yeA8O87H8d7wlozp5M+GIxEGs3VqYO6SDzi2ezuhoaGIxWID2wZ7e/v7cWmVIjY2lkmTJvHyyy/z5JNPGn1ZV7e/FKCxhy3PdQ5g9f5bzB0QYrCvouXclJQULl68SP/+/Y32PWj++OMP3nvvPd5//32GDx/O/Pnz6dSpE1D9GxKofjawOVHpRCoLO8TB3Xj0s//qhWNAdTh69CihoYYzbmq1mlWrVtGtWzf69etXSyOru8zo0wgXuSULfruASCylKlIRcxUwVVW05Odkjb21ZlXl3SdbGO1fte+mrqAsK3VJoO5ift8695HKqM2i0vL551oiA5t7IhZRpmrym//CGdPJn24NXY2Wfzdu/p7iBM2dsH4xCSCTyZBKpVhYWGBlZWVgVmtvb4+joyPOzs64uLjg5uaGh4cHXl5eeHt74+fnh41N9ftRTp06xd9//83ff/9Nr169WLNmjYGP270s5y5+rDl7ryRyOiLd5H5Ty7n5+fmsWrWK5cuXk5+fT0pKCq6urtW+vprAyspKdxOwc+dOfvvtNzp37sxLL71EYNvu1bohgapnA2tnltRqNceOHeOHH37gzz//5JtvvmHQoEH36/LvG1V1DNDuNnfHgOqyefNmFAqF0faMjAwOHDggFJRlcHjTB8Ru3cHARZu4nKqs9wKmqoqWTCUsmeJhES0JGCIUlFWgsmqz+MxCZFIJckspuUXGH9oA8VkFgMa7qzTr1qzmq4/e5tSpUwb5rpaWlnTu3Jns7Gzy8vLIy8sjNzeXtLQ0SkpKUCgU5aYmaBGLxUgkEl2Ul7YotbGx0RWlTk5OuLi46GK9vLy8uHz5bvP0kSNHaN26NVOmTOGdd97Bzc2t2su5Q1p40j7Aif6fHMLXydrkmPWXcxUKBZs3b2bBggWkpKTorjk3N7fCglKlUpGbm0t6ejrp6elkZmaSlZVFdna27l9ubi65ubnk5OSQl5dHfn4+BQUFFBQUUFhYSGFhIUVFRRQXF1NcXKx77hUKBcXFxbqbAO0X9smTJzl58iSWXo3xmvBJueMr64akKtnARQoVV69eZcuWLXz33XfExsYikUhQKpUmTb/rOoJjQM2zbt06EhIS2LVrl8H2xo0bs2zZsloaVd2loKCAOXPmsH79eiwsLNg1d9Dd1ot6LmCqz6IlAUOEgrIK6KvaysPfWU5hiZK8YtPFpPYYgPRcQwNYEfDMY/2YNGIg//77L6+88grXrl3TPMbfn8OHD1c4zuzsbF1agjYxISUlRZeaoB/hpS2YsrOzKSkpoaSkxGhW1BTalIUvv/ySL7/8klbtOpL16Nt3rqDyy7kyqZgFQ5qy4UgEsZkFZRaUoGk5GDP+Bf74dTv5+flG+zt37oxarTYo8JRKJSqVCpVKVali2xQikQiRSKQrxCUSiW6W2MLCArlcjqWlJVZWVuTk5BAZGWnwWLVaTcuWLXl22mt8GVXx76vMDUl52cCPdO5IUWKYwTbt36uwsBCFQoFU+nC89QXHgPuDVCqlQ4cOBgWlhYUFrVu3Nshqru/cvn2bxMREJk2axM2bmtdho0aam5JGHnYsEQRM9Vq0JGBI/XjF1xD6qjYAZxtLo0SApp529G/qwaGbyajVYCuTUqxQUaw0LNJeuTNTcuiWoZmrvqqtX79+XLp0iW+++YY333wTf//KfRHa29uXa1ZbGYqLi0lISNAVpomJifz6668cPnzYqOCUSqWI7NzRFpNQ+eXcab2DsZCIWXuwbB+yu4j49e/DFJsoJgGKioqQy+UGBZ52Bla7XS6XY2trq2sTsLOzw8HBAXt7exwcHHB0dNTN0Do6OmJpaVml523r1q2MGTNGNyM4dOhQPvzwQ5o1a0ZekYKvluytkRsSMJ0NDGp6d2jOP39FmLwxmDhxIhMnTsTCwgJbW1vc3Nzw9fUlODiYli1b0q5dO9q3b4+VlZXRYx80Men57L6UQOT7Q03u17oFWFmIGdXejwHNPGjiYYdcJiUqLY+tp6L58VS0QduJOTkG3Cvx8fGAppDcu3cvHTt2rNMOEg8apVJJy5YtKSwsNOgXN/U5XN8FTIJoSQCEgrLKaFVtSpWaz59tS2GJirNRGaTlFdHI3ZZnO/lTWKLkgz2aVJwW3vasfqYtOy/FE5mWj5VUzMDmnnQMdObHk1Fcib8rvDClapNKpUydOpVx48aZ7Hm6X1haWhIQEEBAQIBuW2RkJIcOHdIVSwMHDmT27NkMGDCAi7FZDP/CdEqJltLLud4O1kzpEczbOy+X6c1ZmuOnzpB89SQffvghBw8eRCqV6p6XXbt20b179+pfdA3g4qKJ2GzTpg2ffvopPXr00O2rzg1JVbOBA1xs2PPnH8THx/PSSy+xa9cu3SypRCJh/vz53Lx5k4iICBITE4mNjeXWrVvs37/f4DwSiQRbW1tcXFzw8fGhQYMGNG/enHbt2tGxY8d7FoetX78eKysrJkyYUKYSe8GOUJR3ZpXLcwvwd5az9PHmHA1L5ZsjEeQWKejZyI13h7Wkrb8Tc3++qHvMw+QYUFOUNXsWGRmJSCTi2LFjdOjQobaHWedYvHgxhYWaNDP91Y26cLNVF9FPXVLcaTWpNColMksLsxMt1TeEgrKK6Kva/r6axLA23rzYIwhbmZT0vGL2XEnks39v6Ty3YjMLOBWZzsBmnrjZyVCp1dxOzmXBjlB+PBVtcO7yVG33IqapKezs7JDL5UycOJEZM2bQuHFj3b7q9JfOHtCYxOxCjoen4euoWep2s5MB4GJjia+jNXFZBQY+ZTKpmEGDBjFo0CDOnTvHihUr2L59OyqViqKiopq72GrSv39/Lly4QKtWrUwWSlW9IQlytalWNrC3tzc7d+5k69atTJs2jaysLHx8fFi+fLnJcScnJ3Pq1CkuXLjAtWvXCA8PJyEhgeTkZCIjI/nvv/8MjheLxcjlclxcXPDy8qJBgwY0bdqUNm3a0KVLlwp7WRcsWEBGRgY//PAD3377rdGsj9YxoEuQM1C+W0BKThEDPzvMreRc3bYfT0Xz0YhWPN3Bj9X7774f64sBfEXWSv7OciLlLZm+oJdQTJbBE088YfL9cuDAAVJTU2tdAFgXeaajP92CXSt0Y9Ci3V8YfQnL67t58q0DD3C0AjWNSF3dxrJ6zLgNJ8tUtVUXraqtLs+cqNVqFAoFFhbGQqK8IgUtKrGcu25MO/o2cafp4j1sfbELXRq4lHt8q6V7yS7UzECKgMtLBhr1JkVGRrJz504mT56MtXXZPZh1gVtJOQxYpemDff6RQIa18SbAxUZ3Q3I0LNXghsRJbsFrj4bQKcgFLwcrXTbwgeuaLO8MvWxggH2zexoVSomJicycORM/Pz9WrlxZrXFnZ2dz+vRpzp07x9WrVwkLCyMuLo60tDRyc3N1PZpaRCIR1tbWODk54enpSVBQEE2aNKF169a0atWKkBCNNZRUKsXS0pJPP/2UyZMn64rwJTuv8P3JKDoGOPHTlK68vOUsh2+mVMn8vV8TdzZM6Mikzaf5V6/PVCIWMa5zgFkawFfGWkmLVvQlWCuZJiMjA2dnZ6PtVlZWhIWF4e3tXQujenioimipZ5sQEhIS8PHx4ddff6Vz57r7PShQNkJBWQ1i0vPp/+khimowtF4mFbNvdq+H+kO914oDFS7n/jG9O4duJjP5+7N0CHDC2cawR7Gxhx3zHg1h/aEwzkVnsP96ss4qJsBFzqF5fR7MxdxHzPGGpLCwkLNnz3Lu3DkuX77M7du3iY2NJSUlhdzcXEpKSio8h5+fHytWrODRRx9l2DcXiErP1yUu5RYpKmX+rs8zHf344KlWPPXFUc5FZxrsM5fXkj761kpVeW1pPRIFayVDEhISjIpGS0tL5s2bV+ZMv4BpKhItTZo0iW+//RbQ3IzOmTOHd955p85PEAgYIix5VwNB1Waaqi7nnokytrDJLtAUHhdjMw2SF8wpNcEcbTasrKzo1q0b3bp1M7lfoVBw6dIlzpw5w65du/jzzz+NjomJieGZZ55BZmOP1ys/AlUzf9fHQiJiYrcgotPzjXovwbQB/IULF/jpp58YM2YMrVq1qs7TUGsI1ko1j7Z/EjSv7y+++KLcnl+BsqlItOTp6anz71Wr1Xz66afs2LGDLVu20KVLlwc4UoF7QSgoq4mBqk2thnv4kDEXVVtV+0urgjmlJtTHGxKpVEq7du1o164darWaP//80+CLuU+fPvTv358uXboQna1i8QnNl3lVzN/1WfpECxp72PH8plNlJupEpuXhZyvixx9/ZP369Vy8qBHvODk5PVQFpWCtVH3Kmzk7deoUAG5ubpw4cYIGDRrU5lDNGgcHB4PPA5VKRXh4OLNnz+bo0aOCldVDglBQ3gPTezfkh2++IN6rO1JLWZmpOKYwxygu/dSETcci2XQsssrnMJWkYI6pCfXZZiMvT6PObt26NRMmTGD06NF4ed3N9D0fnQEnynYMqCiNakqPBozp5M/Hf9/g4I0U0ycBnhr5NGGn/jXq/3R3f3hmwmPS81m884quNcAUWnslgB6NXHmspTdt/Bxp6G5LQlYB3T8yFEKYu7VSZQRLfULcObJ9F/7+/ty4cUNQdt9nHBwcjN6H7du35/LlyyxfvpxFixbV0sgEqoJQUFaTq1ev8swzzxAaGop70B56vbWxSqo2c43iMsfl3PvFvdhsPMw3JNOnT+fpp5/G19fX5P7KOAaUZf4+sp0vbwxqwg8novj8QPnephFht4y+xACmTp3K66+/joODAy4uLnh6euLj40NgYCDBwcE0adKERo0aVdmjtKokJSVx5MgRhg0bVqY/5IIdoboeYyjfXgngydbePNbKm8txWSRlF2IKc7VWqmwWfFR6vqZ1p/EztO4+npR8FX5CPXlfcXR01P2/hYUFJSUlnD17FtCYyws8HAgFZRXJz89n2bJlfPzxx7ovo5GD+7B2Umchiov6uZx7L1TXZuNhviGRyWRlFpNQuUQqU+bvA5p68MFTLdlzJZFFOy+X82jN+3HBK5P54N2lFBcXG/gM+vj4UFhYSHJyMlFRUWX6v4rFYiwtLZHL5Tg4OODs7IyHhwc+Pj4EBATQsGFDQkJCaNKkSbVmuNavX8+SJUto3bo1GzZsoH379gb7tdZK+pRnrwTw0d4bvPGbpgjdMKEDIR7Gn0PmaK1U1Sx47f4rqSVCFvwDoH379rRq1Qq1Wk1oqOF3R2ZmZu0MSqDKCAVlFdizZw8vvvgiCQkJuhQSkUgkRHGV4pmO/sSl5bDmUKTQX1oJ/JzlfC/ckOjQN4CvjPk7QKdAZ9Y825ZTkenM2naBirwr/F3kLJn3Ji9Nep5Zs2axfft2nQH84cOHjQre5ORkrl69qjOFj46OJiEhgZSUFDIyMkhLSyM2NrZMNbtIJNIVn/b29jg7O+Pu7o63tzcBAQEEBwcTEhJC06ZNsbW1BTQqY7FYzOXLl+nYsSMzZszg3Xff1ZnKbzkZbfIGxMZSUqa9UnJO5bxaJWIRP5yINgtrJUGwVPdp2LAhTz/9NAsXLjTal5FhLN4UqJsItkGVRK1W4+vrq4sr02fr1q0888wztTCquodSqeSnn37ihRdeQNa0D16Pv4pSXfGMgD4P83JuTVGfb0jgrg/l9xM7mXQLUCjVDP/iGGEpufg4WvO/mT2wkIhZ/r9r5BYaziheT8zmemKO7mdTPpR///03U6ZMISkpiaysrHtazs7MzOTKlSvcvHmT8PBwoqOjiY+PJzk5mYyMDLKzsykoKKCkpMRkvrxIJMLCwgKVSmUwO6r19pwyZQqzZs1i3PYwotMLAKplr6SdoSzdQ6mlLGulS5cuERsby5AhQ6rz9DxQfjodXaOrJR8+1bLefibdbxQKBStWrODtt99GpVLpJm2aNm3K1atXa3l0ApVBKCgryahRo0hMTKSwsJAzZ84Y7Dtw4AC9e/eunYHVERQKBT/99BOLFy8mPDwc0KS1nAi9VeXlXMFoWUBrAF8Z8/fyBCkAq/bdZNW/twy2mTKALywsJCEhgaCgoJq/oDLIzc3l2rVr3Lx5k7CwMKKiooiPjycpKYkrV65QXFxs8nEiS2v8Z2/Xzf6383fixe5BRvZKcktJmfZKFRWU+kECxcXF/Pbbb6xevZrjx49jYWFBUVFRnbbQ0foFt/VzrJRgCTTP45uDm9DC24HcohJ2hSawYu8NXTSsOfgF13WuXr3K+PHjdT2UdnZ2ZGebtgcTqFsIBWUlcXZ2JiMjQ5djLZVKUSqVqNVqrl27RpMmTWp7iLXGzz//zPz584mIiNAtGwK89tprfPTRR0DVUhPMeTlXoPKYowF8VfD39ycmJkZXtFlYWDBgwAD69euHnV9T3j1rLCjSJ8BFzp6ZPTkVmWbSXqmighLg4/4unN33B19//TVpaWk6r0AHB4da7W0rKioiJyen3PhD7etHm7ZkSrB06GayLm2qmZc9v738CLeTc9l6KhpPByum9GjA8fA0nt+kef4eptfPw4xSqWTlypXMnz8f0NzsyWQy3f76voJTVxH+ApVAoVDoPjy1Qhx/f38aN27MhQsX8PPzq8XR1S5KpZKpU6eSnp4OYLCE17p1a93/C/2lAlWlvjsGaGdlmjdvzssvv8yYMWN0atjz0RlwtmxrJajYXqkyjB03geKEu/2H2mXI3NxcmjVrphMjubq64u7ujpeXFz4+Pvj7+xMYGIiHh8d98RD87LPPWLBgAa+++iqLFy/W9ZVqqY5g6bWBIWQVlPDM1yd0zgGxGQV8OKIVPRq58t+tVLMULNVFJBIJr7/+Ov7+/owdO5Y1a9bw5LiXKmX3NLazP41MiM0E7j/Ct3glSElJMep1Cg8PJzw8nLCwMGxsbGppZLWPRCLh0KFDDB8+3MjeoU2bNiYfU1FqgoAACI4B27dvx9nZmfbt2xstLVfGWgnKtleqLP169+LfXyNNLr1HRUVRXFxcpgpei7Yn1NLSEmtra2xsbLC3t8fR0REXFxfc3Nzw8PDA29sbX19fAgICCAwMxM6u7KIgMjISlUrFqlWr2Lx5MytXrmTcuHG64rWqgiVbmZTuDV3ZcCTC4Hn67Xwsix5rxtCWXvx3S1OgmpNgqa7zzDPPcDMujV05Hny+6nCl7J42HY8U2qZqCaGgrASJiYZ3tVKp5mlbsGABgYGBtTCiusHQoUMRiURs2rSJjh07GhSUFhYWhISE1OLoBMyB+mwA/+ijj5a5rzLWSmDaXqmyiICfN66jZN1HvP3226xduxaRSIRSqaRv3778/fffumOLi4uJiYkhMjKS2NhY4uLiSExMJDk5mbS0NJ0YKScnh4yMDBISEigpKdHNeJaFRCLBwsICmUyGXC7H1tYWe3t7YmNjUavVqNVq0tLSeP7553n//ff5+OOPGTJkCAduJBsVHitGti5TsBTiaYeFRGwkYCpRqrkan21wA6xUqTlwM5klCAXl/ean09FsyWxwx+6pYq9e7f5j4WmC3VMtIBSUVNyPUbqg7NGjB+vXr6dx48YPeqh1huLiYv7++28UCgUNGzYkKyuLkJAQ5s2bx/Tp02nWrJmu8BYQuBfqqwF8eehbKwGVtleqCv4ucs3noMyR1atXM2XKFKZPn87hw4dxc3MzONbS0pLg4GCCg4Or/HuysrKIjIwkKiqK2NhYEhISSExMJDU1lbS0NDIzM8nOziY/P5/4+HgiIyNN2jPduHGDxx9/3EiwVJk8eHc7TX9eco6x2XtyTiGdAp0NtpnKgheoWQS7p4ePevtuqGz81tjO/mzatAkAKysrNm7cyOjRo+u0uvFBcP36dd1SV1aW5q5+zJgxTJo0id69e1c48yAgUBWqagCv7Rl8mA3gK6JPiLsm0UWl5vNn25q0VyosUfLBnhu6xzS5U2QCBDrbYGdlwYw+DQG4lpDNv9eTAU0h3qexYQRlixYtOHjwIHv37q1RJbyDgwOtW7c26LmuiDZt2uiy17VCSXd3dzp37kyH/sP4NuHu53Nl8uCtLDRJIIvTPAAAkZhJREFURMUK48+tIoVKt1+LNgteaN25Pwj59A8n9a6grGr81qbjkahk7fFocJlrZ47g5OT04AddB9F+mOuzePFirl27xtatW2thRALmTmUN4BWZCagSr7Hvi8U09rQv63QPPWM7+7PpeCQAf19NYlgbb17sEaSzV9pzJdHAXgmghbcD8x41bEXR/vzL2RhdQalUqXmui/EXsEgkYtCgQffpiiqPVgQokUgYOXIkM2bMoFu3bohEIs5HZ/DtF1UTLBWWaMSWpnpTZVKxbr8+popPgXtHm09fmum9G/LawBBuJOYw8LPDuu1SsYjpfRoyop0vHvYykrKL2H4mhi8Ohem+3809n76uUK8KyurGb4m9mmD/7Ar23s7hmY5CQQmaglLfIkgqlaJQKIRlboH7TkWOAV5uzuTk5LBUnsjmzZvJy8vDwcH8ZpIaedjRo6Erx8LT2HQskk3HIit8zC/nYvnlXGy5x2itceqyinn69OkUFxczefJkPD09DfZVR7CkTRBytzOOyHS3syLJRMJQZX+PQNUonU8P4GlvxfQ+weSZEJatGt2GIS282H42htDYLNr6OzLv0RC8Ha1ZsEMj6DPXfPq6Rr359r+XfgzEEoqV9acfozK2Pn/99ZeB8n3QoEEsWbLEKG9YQOB+YsoxQHtT8+OPP/Lnn3+Sk5PDrVu3aNiwYW0M8b5SX62VtP6EpqiOYOlmYg4lShUtfRzYHZqgO8ZCIqKZtz27LyUYPFZ05/cI1Cym7J4A3hrSlPPRmUjEIpzkd1OsWvk68Fgrbz779xaf7tN8v285FU16Xgkvdg/iu+ORXE/MEeyeHhD1oqAU+jEqpio9pe5WKq5duwZoCsnly5fTrl27Whm3gICWkpIS1q5da5D9m5OTU84jHn7qu7WSKaojWMopUnD0dirD2/qwZv8t8u4k4wxv64utTMpflw0LSp1gSaBGMWX31CnQmcEtPBm65ghLS1k1dbwjlvrzkmEk8p+X4pnSswGPtfLmeqKmh1iwe7r/mP07onQ/RnNve2b1a0zHQCdkUgnR6flsPR3NpmORWFmIGdXejwHNPGjiYYdcJiUqLY+tp6L58VS0zhjYnPoxqtNT6lSYiNzdny9WvMP48eMf/KAFBExw6NAhZs+ebXLfzJkz2b17t1mK6eqztVJZVEewtOLvG/w29RG2TemqS8qZ3KMBh2+mcOhmiu44U4IlgZqhtN2TWARLn2jOtjMx3EgyvjmUSTRtB6V7XAvu/NzS524PtWD3dP8x+yYQ/X6MHo1c+e3lR3C1tWTN/tss3XWF/deT8LTX9M34O8tZ+nhzRMA3RyJ4769rxKQX8O6wlqwYeVeBqO3HeNj56XQ0/T89xLHwNKDyPaWZVh54v7gOy6a97/cQBQQqTb9+/RgxYoTJfWfOnDHr2coZfRrxwVMtkUnFSMRVK5olYhEyqZgPn2rJ9D7m0RYwtrO/7vPq76tJONtY8GKPIN55sgWPtfJmz5VEHl97hLCUXN1jrsRnM3bDSQpLlCx6rBnPdvJn25kYXt5y1uDcZQmWBO6N3CIF0en5BtvGdg7Ax9Galf+YvlkKS80DoEOAoa2T1ubJw96wJ1Zr9yRwfzDrGUr9fgxbmZRPRrXmwPUUXv7xrElftpScIgZ+dphbyXc/ZH48Fc1HI1rxdAc/Vu/XKCbNoR/jXnpK1YgoUVFvekoFHg60CuRff/3VYHvz5s05e/asQRawOVJVayXtfnO0VqqOYAngTFQGI788Xub+h0Gw9LASlZZn0GrlKLdgzoDGrN5/y6hlQcvBG8nEZuTz1pAmFJQouRyXRRs/jSinRCnYPT1ozHqGUtuPAfBka2/c7KxY8fcN1GqwtpBQevUrI7/EoJjUsveKxti8oZutbpu2H+NhpKZ7SredfjifBwHzo23btowaNcpgprJRo0ZmX0xq0Vor/TOrJ+M6BxDgIqf0fKVarSbARc64zgHsm92T7yd1NqtiUst7w1sireJsbUU8DIKlh5XSNkzzBoSQmV/C5jvWWKYoUqh4YdNpMvJL+PK59hyd35dPRrVm9f5bZOaXkG9iNlKwe7p/mPUMpX4/RreGrmQXluBpL+Orce0JdrMlr0jBjvNxvLP7KkXlvMjc7qQoZOTfvUsqrx9DrVaTn59fJzO+9XtKy+snBU2LwGMtvWnj50hDd1sSsgro/tEBo3OaU0+pwMNN+/bt2b59OwBvvvkmH3zwAVFRUbU8qgdPWdZKz44exc2zR5m69G3efOLN2h7mfUUQLD1c6NswBbrIebaTP8t2XcVDz8pJJhUjlYjwdbQmp0hBVoFmEujRVYdp5G6Lg7UFt5JzNW0LQ5txMiKt3N8jULOYbUFZuh8jyNUGqVjE1+M7sO1MDB/tvUGXBs688EgQ9tZSZv50weR5LCQiJnYLIjo9n4uxhjmvpeO3CgsL+eGHH/j444+Ji4sjLS0NS0tLU6etNbQ9pT0aufLN+A5cjc9mzf7b5BUrCHCW6/pJQTOr+1grby7HZZGUbRxJpkXw+BKoi7z//vv873//0wlxKmOHZY5orZXUajWJ186gLilk4cKFRERE4OjoyIcffmiWYiUQBEsPE/p2T572VkjEIpY+0dxI2Q1wZH5fvj0awbJdV3Xb9FcXe4e4IRGLOFrKgkiwe7q/mO2nael+DLmlxsD2hxNRLP1T8yLceyURS4mYsZ0D+OSfm0Sm5RudZ+kTLWjsYcfzm04Z9SNp+zFcJYWsW7eONWvWGFiWSCQSHhTFxcVMnTqVQYMGMWrUKJNfENqe0sr0kwJ8tPcGb/ymKUA3TOhAiIfpviFz6CkVME/mL/+U1f87T68VByq0w2pUxuvbHFi/fj3Lly/XxaSqVCq+/vprLCwsePfdd+vcjW9NImTBPxzo2z3dSMphyvdnjI6ZOyAEG5mEZbuuGiRA6SOTipk7IISk7EJ2XjS0ExLsnu4vZvvMlu6TKCzR/Fz6BfbHhXjGdg6gnb+TUUE5pUcDxnTy5+O/b3DwRgqm6DdgIElXTxptl0gkLFq0CGdnZ5ydnXF1dcXNzQ13d3c8PT1rfDk8MjKSjRs3snHjRj7++GNWr15Nly5dDI7R9pSa6ictVCiNCstkE+kQZSF4fAnUJe7aYeUjcWiCMt34y6e0HVaPhq5mJ07RkpiYSGyscUKOp6enWReTWgTB0sOB1u4pI7+Ev68mGe2f2C0IsDTY9/mzbUnOKeJWUg62VhY83d4Xf2c5L2w+rfMTBcHu6UFgtgVl6T6JpJxCQjztSM01LJLS8jQ/O1hbGGwf2c6XNwY14YcTUXx+4HaZvyc3O9PkdqVSyfvvv1/uGEUiEWKxGKlUilQqxdLSEplMhpWVFXK5HLlcjo2NDXZ2dtjb2+Po6Iijo6OuSHVxccHd3R13d3dSUu4WvOfOnaNr1648/fTTfPjhhwQGBgJ3e0rvpZ+0LASPL4G6QnUjVo+Fp9H/00MsfaI5z5jZbNSCBQv48MMPKSw0bF2JiYnhjz/+4Mknn6ylkT04KpMFr1arcbZU8mSHhjzXxV9YcXnA6OfTV5bQuCxGtfdjzB1v0dOR6by67QJXE7INjhPsnu4/ZltQlo7fuhyXRc9GbnjYWxF+x7sK7ma3punZEgxo6sEHT7Vkz5VEFu28XObvEAGJt0LZu3snc+bMISYmRhdH6O3tzb59+0hOTiYlJYW0tDTS09PJyMggMzOTrKwssrOzyc3NJTc3l/z8fAoLCyksLCQjI4Pk5GRKSkpQKpWoVFUr8JRKzV3Z9u3b2b59Ow0aNKDfwCFEOwwCqt9PWhGle0oFBB4092KHpbyzHGqOdljJyclGxSSAi4sLBQUFtTCi2qMswdKunb+zeM400iwleK1cyY/rk5g5cyaOjo61PeR6g77dk6kbwWe+PmG07cvD4Xx5OLzc8wp2Tw8Gs/3mLx2/tftSAtN6N2R0Rz+Oh99Vfj3T0Y8SpYoTd7Z1CnRmzbNtORWZzqxtF8rsLwRNP4atlQUjRozgscceY+3atSxevJjc3Fzs7e1p2rQpTZs2rZHrUalUZGRkkJSURHJyMqmpqaSlpZGWlkZGRgahoaHs3bvX6HEikQiRSERkWh7qO9Zb1e0nrQjB40ugNhEiVsvGxsaG0aNHk5mZqfucaN68OZcvl33DXB+wkUmRZCew6v33+eOPP1CXFJJXAlOnTgVgyJAhdOjQoZZHWb94b3hL+n1yEKVajZG3XzUR7J4eDGZbUIJh/NaVhGy2nY5hdEc/pGIRJyLS6RLkzGOtvFl74DbJOUX4OFrzzfgOqNXw1+VEhrT0Mjjf9cRsridq0jZK92PIZDLmzJnDhAkTWL58OR4eHjV6LWKxGBcXF1xcXGjWrJnR/u3bt7N3714kEglKpZLg4GDmzZvH+PHjkcvlnI/OYPgXx4Dq9ZNWFsHjS6A20NphdQly5qcpXU0eM3zdUc7HZAKaL5jpfRoyop0vHvYykrKL2H4mhi8OhelmRszJDsvJyYmffvoJgB49enDkyJEau9l92Dl79izfffed0XaZTEabNm0e/IDqMbGxsby9aBFJFxNxGjijxs4r2D09GMy6oCzdj/HW76HEZxUwqr0vjzbzJC6zgGW7rvDtUc0xfk7W2N/ppXz3yRZG51u176auoCyrH8PFxYVPPvmk5i+mAqysNEv3PXv2ZN68eQwaNAix+G4fqX5PaVX7SauC4PElUBvoR6wCbDwaYWTzFZl2t9Vl1eg2DGnhxfazMYTGZtHWX5Ou4e1orYtVNVc7rJ9++glfX19atevIlfisemejVJoxY8awfv16jhw5YrC9pKSEK1eu0Lp16zIeKVAT3L59m99++43t27dz9qwm5lIkErHw3Y9Y+9+9h2YIdk8PDrP+9Cjdj6FQqfns31t89u8tk8efiEgn8M3dFZ63LvZjPPbYYyQnJ+Pm5mZyv35PaVX6SauC4PElUBvoR6xqORWZzv8uJ5o8vpWvA4+18uazf2/x6T7NEvmWU9Gk55XwYvcgvjseyfXEHLO0w7qVlMOWs5kEvrKZDdnObFhzt4iqTzZK+ohEInr16mVUUKpUKsaNG8elS5dqaWTmTXJyMv379yc0NBSxWGygFXjhhRd4bUhL/NwcBLunhwizn06qL/FbYrG4zGIS7vaUgqafFGB0Rz+DY0r3k1YVweNLoDbQj1jVx8ZSYnJ7x0BnAP68ZNjy8eeleMRiEY+18tZte5gjVvWJSc9n3IaTDFh1mO9PRqG2cYFSoYz6NkoDVh1m3IaTxJiwWzJH/vvvP6NtPXr0YNKkSbUwmvqBpaUlqampiEQiI+HplClTAI3d077ZvXikgQuAyfezPtr9jzRwYd/sXkIx+YAx+29/IX7rLtqe0sr0kwI08bSjf1NNL2igsw12VhbM6NMQgGsJ2fx7PVl3bsHjq/5RV5Jn9CNWtawY2RpbmRSFUsXpyAze+981QuM0S+AyieY+urBEafCYgjs/t/Sx120zBzsswUapYmbOnMngwYOJiIjgq6++wtbWlsOHD9f2sMwaR0dHDh8+TNu2bcnNvZty4+vrS6dOnXQ/V8buSYRmQqNPY3fB7qkWMfuCEoT4LS36PaUV9ZMCtPB2YN6jIQbn0P78y9kYg4JS8PiqH+g+1G8k14nkmdIRq8VKNX+FJnDgRjIZ+cU0crdjco8G/PxSV0Z8cYwrCdmE3Wnz6BDgTGxGnO6xne7MXHroxY+CaTusnJwcfvvtN/bv38+HH36Ip6fn/bzMaiPYKFWOESNGABofyu3bt+Pm5Sv0lz4AfvvtN3Jzc3WezADjxo0zmfRWlt2T8PepO4jU6vKMccwL/Tv1+tqPMW7DyTI9vqqLtqfU3MQLAne5mzxT+ZSRB5E8cyU+i6FrjpR7TICLnD0ze3IqMo0JG08jk4r5d04vZFIxC/+4wuW4LNr4OfLOky2ws5ISl1lA748PGpxj9yvdCXG34Z9//uG7775jx44dFBVpZvIPHjxIr1697tclVpufTkfX6MrMh0+1fOg//8pDe7P0y/Fr5KqtDCxr6mt/6f1k+fLlLFy4EDc3N/7880+GDBlCeno6Fy9epFWrVrU9PIFqUK8KSqjaF6NYBCo1ZhXJFpOeT/9PD1UrDacsZFIx+2b3MovnR8CYe70Ru9cl019//ZW///6bnj170qtXL3x9fXX79O2wymP1M20Y2NyTpm/vQaWGRu62rB3TjsZ3CoOiEiXv77nO9N4NSckpZEipIlW99yPiQ4+hUCgQiUTof2yGh4cTFBRU7eu7H2jf5239HCtloyQSwZiO/ozt7E+Aiw35xUquxGexev9tzkVnAOb7Pq+rN0vmxM2bN7G2tsbPT9O3v3jxYpYtW4aHhwc3b97E3t6ea9eu8e+//zJ9+nSTM5QCdZ96V1Bqqagfg7xUbLOj2PHRbLPrxxBmLgQqy70smeoz79HG5S6ZqtXqMr9EpkyZwtdff6372d/fn/79++Pv74/IyY9vEyr2fH1jUBOm9gqmxZK95BYpdNsbudviYG3BreRcCkuUXF06iP9dTmDG1vMGj0/f8ho5MddMnlsmk2FnZ4erqyu+vr4EBwfTtGlT2rRpQ/v27bG1ta1wfFUhOzub9PR0XaSqKbQrER0DnPhpSleTNkqHbiaTkV8CwFtDmjK5RwN+Ox/L6Yh07K0tGNPJH29Ha0auP8bF2CyzXImo7Zul+oBarcbf35+8vDyOHDnCd999x4cffoiXlxc3b96s8feHQO1Rb5sOKurHaNeqOZdv3uR4vyAajhtX28OtUYSeUoHK8KCSZ3744QdmzpzJnj17DJrxtXTt2tWgoIyOjubbb78FQGRhhf+cnytM1PB3llNYoiSvWGGw/VbyXTFA7xA3JGIRR0tZEImA+JsX+fG7jcyaNYuioiKdKtXS0pKQkBCSk5OJiorixo0b7Nu3z+DxYrEYa2trnJyc8PDwwN/fn0aNGtGyZUvat29PSEiIgWdsRbzzzjt88sknzJs3j6VLl+o8aHXXVEUbJYlYxHOdA9gdmsCc7Rd123eHJnDk9b4Ma+PDxdgss7NREvpLHwwnTpwgNjYWsVhM+/btKSwsxNfXlxs3biCXCzO85kS9LSj1sZFJjeICtfmtzz//PM7OzgwdOrQWRnb/mNGnEa62snrfUypgGm3yDEBzb3tm9WtMx0AnZFIJ0en5bD0dzaZjkbrj2/k78ebgJrTwdiC3qIRdoQms2HuD/OK7SurSyTNKpZL58+ezcuVKAP766y9dQXnx4kV+/PFH9u/fz7VrpmcGPT09+eWXX1hwrFgXsepsY0l6KR/VpnfcCg7dTC4zSlUmFTN3QAhJ2YVGCVLaiNUpU6YwZMgQJk+ezJ49ewBo1aoVp0+fNjg+NTWV06dPc+nSJa5fv05ERATx8fGkpqZy6dIlnXmzPhYWFtja2uLq6oq3tzdBQUGEhITQunVrOnbsiKurq+7YGzduoFKp+Pjjj/n111/ZvHkz3bp10+3X2iiVfk/bWEooVKiMtkvFIqwtJcZBB7nFKFVqAzW81kZpyRMPr+odhJjOB8mPP/6IVCpFoVBQWFiIWCxmz549QjFphtTbJe+KaNCgAREREYDmw3737t0MGDCglkdV81Slf0itUiISS4T+oXqAdsn0kWAXvhnfgavx2ey6lEBesYIAZzkikYgP9lwHoJmXPb+9/Ai3k3PZeioaTwcrpvRowPHwNJ7fdLfY0l8yzczM5Omnn2bfvn26fkQ3NzfkcjlxcXEoFJqZRIlEgpeXF4mJibptAOPHj+fLL7/EysqKJTuv6CJWf3yxM4UlKs5GZZCWV0Qjd1ue7eSPQqlm+BfHCEvRzEh+/mxbknOKuJWUg62VBU+398XfWc4Lm09zLCzNYMzjOgcYFFBqtZotW7YwY8YMRowYwYYNG6r03KpUKq5fv87Zs2e5fPkyt27dIjo6mqSkJDIyMigoKDDy5ROJRFhZWeHg4EBGRoZOEKTt55w2bRoffvghtra29FpxQFdga6Moc4sUZdooAex4+REae9ix4PdQ3ZL3K30b0bWBC0+uPUJMRoHu2AAXOYfm9anSNdclqtJf6utozZH5fcs819ZT0by5I9Rs+0tNURWFtVKpxMPDg7S0u+8psViMp6cnJ06c0PVUCpgHQkFpgpKSEqytrVEq796Zi0QievbsycGDB2tvYPeRynh8Xd//K+mn/mDCsIGsX78eqVSY4DZHbiXlMGDVYWxlUg7M7cXZqExe/vFsmbN7G5/vSDMve/p9ckjXnzi6gx8fjmjFuG9P8t8tw+XXZZ0tePWF0WRmZhqdy8bGhsaNG9O7d2+effZZOnbsCMDgwYPZs2cPIpGITz75hFdffVXXc6kdL8DzjwQyrI03AS422MqkpOcVczQslc/+vUWUXj79Sz0bMKq9H75O1hSWKDkdmc6n+25xNSHbaEz7Zvc0ucSbn5+PSCTC2tq64ie1iuTm5nLu3DnOnz/PtWvXCAsLIy4ujtTUVFJSUkw+RiQS8UivvsR2ma3b1s7fiRe7BxnZKMktJTobJdAUiZ8/246WPndXaqLS8nhh02mDNC3QfB5cXjJQV0QUFhaydetWVq1aRbt27di4cWMNPxs1S1X6S60tJAxsbmwJ1auxG8Pb+jBty1n+upxolv2l+lTXLuzff/+lf//+BufSpuL89ttvDB8+/MFcgMADQSgoTbB3714GDRpktF0sFpOcnIyLi0stjOrBUdYdaOPGjbl1SxNb2bdvX3755RecnJxqebQCNY12xu+ZDn4sH96Sfp8cIiwlF2sLCYUKpUFhaSuTcn7RADYcidDNWAJYSEScX/Qouy7FGwrAVEqyz+0mY99XJn93aGgoLVq0MNq+du1aFi5cyLZt23j00UeN9tcXO6y8vDwDEYP2y9nGxoYGDRoQ3KEX5z2MP7v0KW2jBOBqa8mbg5uSW6Tg2O1U3OxkTO0VTGGJilFfHtOJd7TsfqU7jupc1q1bx7p163Q3Bz179uTQoUM1e9FVRKlUIpFITO7Tv/nQzt6+vOVsmf2lZfHDpM608nWg4/J9Bo4ZZd18PKzcqwK+UaNG3L59W3dM165defrppxk+fDgBAQEP4hIEHiBmH71YHRYuXGhye8uWLbGzM58Pi7LQ9pS29XeiubeDyeWMQ4cO0aFDB12BKWA+aJNnujV0JbuwBE97Gf/O6cW1ZYO4vHgg7z7ZAplU89ER4mmHhURssHwKUKJUczU+26g3GbEEnw4DmDp1KgMGDNDN7mlnG48dM20BNG3aNFJTU00Wk1B/IlZjY2N1/+/o6MjLL7/MyZMnycnJ4dKlS7y9ZFmF54hKy+efa4l0aeCCWHSnL3JSZ3IKFSzeeYW9V5P44WQ0z204ib+znJd6Bhudo2//R/H19eW9994zmGnOy8tj3759XLlyhexs49ne+83FixeRyWRMmTKF5ORko/1Vjek0hZudjK4NXNh7OdGgmDSXmE4tP52Opv+nhzh2J4q3qglLU1d8x+3bt7Gzs2PdunUkJiZy7NgxZs2aJRSTZoqwZmmCESNGcObMGaPtEyZMwNLSshZGVDfQj8dSKpVERkbSqlUrfv/9dwYOHFiLIxOoKfSTZ4JcbZCKRXw9vgPbzsTw0d4bdGngzAuPBGFvLWXmTxdwt5MBkJxTaHSu5JxCXfqMwe/Amo9XrcFGpmnUP3/+PAcPHuTEiRM0b25a7CESicqcdYL6E7EaFBTEggUL6Nq1KwMHDsTCwsJgv6W0cnME8ZmFyKQS5JZSWvo40MTTnnd3G4qfItPyCUvJpX2A8SpERprpZfezZ88a9Zpr/3YWFhbIZDKsrKyQy+XY2Nhgb2+Pg4MDjo6OODs74+rqipubG56ennh5eeHt7Y23t7fRdZbF7du3USqVbNiwgR9//JGlS5fyyiuv6D63qxrTaYonWnkjEYv4/UKcwXZziOnUUhMK+D3pLjz+xlr+eO9lwVeyniAUlCZ47bXX6N69O8OGDSM9PV0nGmjatGktj6x20S8oQSMuKCwsZOfOnUJBaSZEpeXp+qPklpqC44cTUSz98yoAe68kYikRM7ZzAJ/8cxMrC02RV2zCKL9IodLt10cNRKbl0dzbAalUSseOHXW9kveCvh1Web6WlaGu2mFZWlqyfPnyMvcHutggAipa+Ne3UXK7c1NgaoZOesfRQR8RcOvcMd5/ZwlfffUVIpEIlUqFRCKhb9++DBkyhOTkZNLS0khPTyczM5Ps7GxycnLIz88nPz+f1NRU4uPjKSkpQaVSUZnOK7FYjIWFha4wtba2xsbGBltbW+zt7XF0dNT1l6pUKvLy8pg3bx6ffPIJH374IU+MeLrKMZ2meLKNN0nZhbqZO31MxXSCZuZ0x44dTJs2DXd39wqvtTapSQX8JQLYfiamTr6XBGoeoaA0gUQioXv37hw6dIhu3bqRlaW5W23SpEktj6z2UKvV5OXlmdwXEhJicrvAw4d+YVhYovn/0jY6f1yIZ2znANr5O1Fwx1LG1MyYTCo2sJwp6/fUJE1V0WTs/RzHflOQWMrqnR2WjUyKv7O8SjZK4XeU74+38uLQzbszj8297WngZsvWU4bLuP4ucgJ8PFm/fj3Tpk1j5syZHDp0CKVSSefOnZk1a1aVx61SqUhKSiI2NpbExESSkpJITk4mNTWVtLQ0MjMzdYVpXl4eeXl55Ofnk5GRQUlJCQqFwkgZryU+Pp5x48ZhOW8xXi+s1m0/F53BtB8zdD/vu5bMX5cT2DOzJ68PCtH1l+oT5GpDK19HvjkSblKkpn+zVFhYyM8//8yaNWt01lItWrRg5MiRVX5+HhRauzBtf6kp9BOWQNMvPblHA0a09cXXyZrsQgWhcVks2BFKYnahkV2YgPkiFJTl0Lx5cw4dOkTbtm11bv/1GQsLC51diT71oa+0vqBfGCblFBLiaWfsT5in+dnB2kJXuLjbGZpra7cl5Ri/Xkr/npogJiaG1157jW3btgHwWIdGiDuPrZKY4JEGLmZhh9UnxF1no/T5s21N2igVlij5YM8NAC7HZ3P4Vgoj2/thK7Pgv1spuNvLmNA1kMISJd8ejdCdWyIW0afx3Rm2Vq1aceDAAXbu3MnSpUtNGtNXBrFYjJeXF15eXvd07YsWLeKDDz4wsJiSSqU0bdqUnk+NZ5fpl6MObX/pwOaeuuhdfYa18Qbg9/NxJh6tYdsvv3Fmz88cPnyYvLw8g5lyZ2fjFpAHhUqlIiMjo1xR6YIdoSj0LtqUAj4y7e7EglQs4tsJHWkf4MRPp2O4lpCNg7UFbfwcsbOSkpgNCpWaBTtC65S4TeD+IBSUFdC6dWvefPNN3nvvPSIjI/Hw8a+0B5c5IRKJOH/+PIMHDyY2NtbAUsne3r4WRyZQk+gvmV6Oy6JnIzc87K0MrGO0xWNaXjE3E3MoUapo6ePA7tAE3TEWEhHNvO3ZfSmB0oju/J6aID8/nxUrVvD+/9s77/CmyvaPfzK6994thULZlLL3niIbRBFFWSrwunDrK/xeFQUHilt5RUWG+gIylI3svWdpge6990iT3x8hIWnS0oVtk+dzXVzCeU5OnhPPSe5zP/f9/S5dSlnZ3U7kGRNHM3Jkj2rJYQ1q5cmjPQNNpjt3eo9AVh+LBmDX1RTGh/kyu1+wVkZpx5VkAxmlOT+dZm7/5jzY0ZcBrTwoK1dyMjqTj3ff0Pt/X65U8WhP/QdriUTCuHHjGDdu3D9yflVRWFioDSaDgoJ4/vnnmTlzJk5OTlxJzGFbBY92Y+jWl+radAKM7eTHzdR8LidW3nD0/rv/oSz1bhCuu5w/duxYHBwccHBwwNnZGTc3Nzw9PfH29sbf35+AgACCg4Np0aJFvVsSbty4kalTpzJnzhzee+89g8Cypg5LALP6BtMj2I0p3xw1CDw1mJrDkqByTD8Sqgemzv4X6yIUPPxLBKmF16qtwWVqtGnThjNnzjBhwgQOHTqk3S4ylKaD7pLp9otJPDMwhIe6BXBMp15sWrcAysqVHL+VQV6JgiNR6Uzo7MfKfZEU3HHGmdDZH3srOX9eNgwoA91s6+UhLCkpiS5dupCSkmKw3KnpIr2XxaopPgy29HKgX4g7R29lsPpotJ6jUWWUKJSs3BfFyn1Rle6jkVFqzEFBr169GDNmDPPmzWP06NF6lpa1qS/VJSzAmWB3Oz7aHVHpayXAzt/XsOSt1zlw4IBWeF6Dq6srxcXFJCYmEh0djUKhqLJ+VCaTaRuZ7O3tcXJywsXFBXd3d7y8vPD19SUgIIDAwECaN29OQEBApTaeN2/eBGDVqlVs2LCBDz74gNmzZ2ub3WrqsCSRwBO9g9l1NVnr9W4hk2hLZfTOw0QclgRVY3rfpvWIngZX6ABSCg1vFBUQk1nIzydiWH0s2uRdZNzc3Ni7dy/z58/X+itbWVk18KwE9YlmyfRKUi4bTsXxULcA5FIJx29n0jPYlTEdfflifxSpd5azl++KYONTvdkwt5fWKWdOv+YcvJGmV5MHhkumtUWlUrF9+3bs7e1JTjbMoBgrTzFmsWqqvDehA0M/OVCvupyNUUapIpMnT660RrE29aW6jOukXu7+47x+TbEugW62DOrXm0F//83JkyeZN28e58+f145HREQYCOGXlJRw+/Ztbt++TWxsLPHx8SQlJZGSkkJmZiZZWVnk5uaSm5tLamoqpaWlldaLgjpjrGlcsrOzw8HBAScnJ9LT05FIJJSXl5OTk8NTTz3Fxx9/zJdffsmQIUNq3AHf0tMebydrriXl8d6EDkwK98NKLuNaUi7/t+2q3kOoKXXACypHCJtXwvpTsXXyuV4yth3Tmmhhf3VQqVQ89thjrFmzhi+++IJnnnkGqJktl6Bxoiv+LJdKmD8ohCld/PF0sCYhu4ifj0fz3yPReq/pGuTCqyNb097PifwSBdsvJbFsx3VtxlKX+hB/vnz5Mh06dMDJyYm2bdty7Ngx7ZiLiwuZmZl1Or4psP5UbL3KKH0wsUOTbVbSUBubTgCpBE68NoS4rCImfmVcK9WYTWd5eTn//e9/eemll1CpVNoGz7qiUqlIT0/n5s2bxMTEEBsbS2JiIsnJyaSlpZGZmUlOTg55eXkUFRVRUlKiVxJSEWt7J7zmr1GnHamew9KItl58M6MrmQWlZBeV8uV+dQb0mUEt8HO2YdwXR7ienKd9j4oOSwLTQwSURqiLBpcui4a3YsGglvUwo8ZLnz59cA5qTbdpL9TYlkvQeGnszjNbt25l7NixettatmxJZGQknTp10ssKmTP19V320vBQ5g8KqYcZNSy1sekE6N/SnZ+e7MHbW67w4536VGNU9rCUmZlJSkpKg0rPjR8/nj/++AO467Bka2tL+/bt6TPmITYWVq3WUdFhaUJnPz6ZGkaJopyBH/5NUo5ai9bXyZq/Fw1i+6Uknv/1vN4xti/sazarBOaIeFSoQH1qcH246wYe9lZN/qm+MuIyC/F5+F1OJxRw/c5Tf0XMrSTAVGjsS6YxMTF69WkSiYSUlBRmzpxpIKxtziwY1BJ3eyve2nQRhQpUVF+b0xRklCpSm/pSgIOR6TR7bXul4/eqL3V1dW3QDm+AlJQU7d8HDhzIggULePDBB5HL5ZyLzWJjJZlXDRU74DWSYGdisrTBJEBiTjGnYzKNCuLfL7kwQeNABJQ6aDS4NLTzdeS5Ia3o1swFK7mM2MxC1p2K1X4JaZYDJ4X74+VoRUpuCb+ejuOrAze1P8SmqsGlWxIANbflMvWSgKZOY3eeiYmJQSqVatUGVCoVubm5JCUl8cgjj9TLe5gKPdzLSVm9kFbT3yZd7mF2MkoVaewPS/eLRx99lD59+jBv3jxattRfOauNw1JKrrqGuqKsGEBGfqnRTGR9y4UJGhcioNRBV4OrX0t3vn+sK1cTc1m5L4qCUgVBrrZ4O97V21vxUBij2/vw65k4LsXn0DnQmUXDQ/F1tuH1TeofYlPU4KoPW65XN14iPb/E5EsCmjK6zjN1pb6dZ27fvq0NJqVSKZaWlrz11lu88MIL9fYepsCRI0cYPHgwpaWlrJ/XF5WDl9nJKFWksT8s3S/mz59f6VhtOuAjknMpVSjxcjSiQetopdWr1VCfcmGCxokIKO+gq8FlbyXn4ymd2H89jafXnjHqiNDR34kxHX35dG8kn+xR/+D+cjKWzIIyZvcN5qdj0VxPzjM5DS5REmBeaJZM69KgVtMl0+o0du3evVv79+nTp/P+++/j6+tb7fcwdcrKyli8eDFLly7VlgUEBQVhYWFhdjJKxmjMD0sNQW064AtKy/k7IpXBrT1p4WHHzTS1XmkLD3u6BLqw1ojDkrlcX+aK+L97B10NrnGdfPFwsGb5rghUKrCxkFGsKNcLLLs1U9fDbL2oLyGx9WIic/s3Z0xHX64nq/XKTEWDq6YlARIJPNItkOk9Aglys6OwtJwriTl8ti+Ks7FqyzNTLQkwJaZ1C6RPC/e7Elr3YclUK0BejcYucpPJzc3F1taW/fv319qdxVSJiIhg2rRpXLhwQa/GVC7X/7o3JxklY+g9LJUrKa/BCrgp1pfW1GEJYNmuCHqHuLN2dk/t9/7M3s3ILirji7/vaprWl1yYoHEjAso76Gpw9QlxJ7e4DG9HK76d0YUWHvYUlCjYdC6B/2y/SolCiZVMXQtS0atY423cwe+ue0xlGlyZmZl88803bNu2jc2bN+Ph4XE/T7HO1LQk4PVRbZjTrzkbz8Xz8/EYHG0seKR7IBvm9mTy12pnBVMsCTBFAlxt+XlW/TvP6Gm9VhKoVmzsci1JoXmHblw8th87O7GEpsuGDRuYPn06KpVKTzDbyspKzwJQoGZat0B6NnNh0Cvfgldrs64vrY3DUlRqPg99e4xXR7ZmwaAQlCoVx25m8N5f17Q1lmDcYUlgeoiAEsgvURCbefcmCXa3Qy6V8N1jXdlwOo5lOyPo2dyVJ3oH42gj51/rz3Pzjh1Z1yBX4rPu+rp2v5O5rFhXEptRSEGJAjsrOTdv3uSTTz5h1apVFBeru+Pi4uIaNKA8efIkpaWl9O3b1+h4TUsCZFIJj/YIYvulJF749YJ2+/ZLSRx+eTDjw/y4EJ9jciUBpk59Os/UtrErx9oL2djFbL2awbRuIqDU5fDhw3q2qBosLS0bYDaNn+LiYh4c3Jvoy5fZsOMgV0tczba+tLYd8FcSc5nx35OVjjcFhyVB/SACSiAmo0Dvy8PWUt3FtuZ4DEu2XgVg55VkLGVSpvcI4uPdN/g7IpX4rELeGN2aorJyLifkEBagbsopK1dibSHTew8V8MLbSzmw+RciIiK0OmAaCgsLKSsrw8LC4h84Y0OeeeYZzpw5w+jRo1m+fDlt27bVG69pSYBcKsHGUmbQAZiRX0q5UqWX2TWVkgBzoy5LpnVq7FJBeblo7DKGhYUFMpnMIKgUblaGREVFMX78eK5cUZfxDO/RganOzmZdX2quHfCC+sH075BqUFEbS+NFuuWCfn3kH+cTmd4jiPBAFzaeS+CJ1af44pFwvnm0CwAlZeUs3XGd+QNDKCzR94EFWP3TGkqT1D+iFa2z+vXrp/27RCJBKpUik8mQy+XI5XIsLS2xtLTE2toaa2trbGxssLW1xc7ODnt7e+zt7XF0dMTR0RFnZ2ftHzc3N9zd3XF1dcXd3b3STEV2djYAO3fu5K+//mLOnDksWbIEb29voOYlASUKJedis5gc7s/Z2CxO3c7E0caChYNbklNUplewLWy5zAvR2HX/KC4uNrq0XZVLijny+++/8/jjj1NUVKTdplsiYK71pebaAS+oH0RAiaE2VkpeMaHeDobZtTsyCE426ixiZGo+w1ccpKWnPU42FkSm5lNcVs5bD7TlxO0MKrJty2bWf/UhP/30E0qlUi+onD17NmVlZeTn55Ofn09BQQGFhYUUFRVRXFxMSUkJJSUl5OfnU1ZWhkKh0B6jpmZHugGrTCbDwsKCvDy1RZYms/Htt9/y/fff06lTJx6dOYvYzGba11enJADguV/P8/nD4Xz6UGfta2MyCpj89VHisu5+kYN+SYDAdKlpYxeAhUzCnH7NmdTZH38XG3KLFVxKyOH1TZdIzi0WjV06FBcX62UnZTIZbm5u/PDDDw04q8ZDeXk5fn5+pKSk6AnjAzX+HjVVRAe8oLaIX28MNbguJ+TQv6UHXo7W3LpTKwng6aCui8yoIKcQmXrX83VgqFo4+MidekMNEqB3h5YMW7WKxYsX8+abb/Lzzz8D6i+yzz//vE7LUiUlJaSnp5ORkUF6ejpZWVnaPzk5OeTm5pKbm1tpwKoJKHVRKpWcO3eOG2krcX/0I+326pQERN8JEG+k5HE2NoujUel4OFjx1IAWfDujK1O+OUpW4d2siQqIzigwyApoAmaZTL+EQNA0qWljl1wq4b+Pd6NLkAvrT8VxLSkXJxsLwgKccbCWk5xrmlqvtaWgoEAvMJo4cSLffPMNLi6GriXmSHR0tNYxpmIAKQLKu+h2wJeUloG0+t+/ptgBL6geIqDEUINr+8UknhkYwkPdAjh2626mcVq3AMrKlRy/ZZh9BLCSS3lxWCgpucUGy+W6GlwBAQH8+OOPPP/887zwwgtERETUuWjeysoKPz8//Pz8avV6a2trSkpKtPVXbdu25ZVXXmHatGlcSS5ggo4tV3VKAuKyilgzqwfHb2WyeOvdjNThqHR2PTeAef1b8P6O63qv15QeZGZmsmvXLnbs2MG2bdvw9fXl4sWLtTqvxoS51mVpqGljF8CsvsH0CHZjyjdqVQBjmFtjV1XX0fHjxwH198GqVat45JFHRHe3Di1atMDGxkZvqVtDUlISbm5uDTCrxslDXQP4YemrnLdsg01wuFl3wAuqh/n8mt0DXQ2uK0m5bDgVx0PdApBLJRy/nUnPYFfGdPTli/1RpOapl74/f7gzqXklRKbkYW9twdQu/gS62vLEj6coKNVvOjGmwRUWFsa+ffv+sXOsDJVKhUKhrvkcPHgwL7/8MkOGDNH+EFnK9b98q1MS0L2ZK629HXln+zW9faIzCrmZlm/U53XurCfJiblCVFQUKpUKuVyOQqEgODi43s71n6Ym+ootvUw7GKppY5dEAk/0DmbX1WQuxOcgk0qwkEm0DzS6mHpjV3Wuo74tXEgvs8DGxoZr164RFBTUUNNt1FS22hEXF0f79u3/4dk0TgoKCpg9eza7Nq0H4EZyrtk7LAnujQgo76CrwQXwxuZLJOYUMaWLP8PbepOQXcT/bbvCf4/c3edSQg5TugTwyB3B11PRmTy74TxXk3L1jt3YNbgkEgmbN28mODiYdu0Mf5BrUxLg4aBevpdJDbMj8jtLIrqoVCrOHNiBqqxYu02hUCCRSLC1tSU5OVnbINQUqI2+Yr8Qd5N+sq9pY1dLT3u8nay5lpTHexM6MCncDyu5jGtJufzftqt6qwem2thVk+soLrMAj8c/pYufLVKHxq1p21iQyWS4uLgwZ84cRo0a1dDTaRRcv36dcePGERkZCYBcLq9XuTCB6SJRicIRLTNWneDorYx6lUzQaHA19fquAcv3a0sC2vk4sv1f/dh8PoHnNpzX7vPpQ2GM7uBDnw/24elgxbaF/fj9TByLfr+7XN3O15Et8/uy7mQsb/5xWbs9yM2WCfILvPTSS5SXlxutZ7KwsMDb25s2bdrQp08fxo0bR6dOne7fSdcSXX3F2lgVLhnbjmlNsPZo7969nDt3jmnTpuHv7683ll+ioMPindqHkr/+1Y8gN3XgvOF0HMdvZWobu7ZcSOBf688zoq0X38zoSmZBKdlFpXy5/yYAzwxqgZ+zDeO+OML15Lu1vxLg8uIRBj9uMTEx7N27lylTpuDg0HSyJ+Z6Hd1vrKysKC1V18GPHDmSNWvWiKVu1A/106ZNY/PmzZSXl2ubuywsLLSfl0BQFeKxQgehwVU5NS0JSM0r4WBkGpO7BGBvZcGhyDQ8Ha14vFczisvK+e+R29pja0oCnhv7HMOHD2f8+PHcvHlT2wX/zjvvcOvWLc6cOUN0dDS7du1i165dvP3220ilUlxcXGjZsiXdu3dn5MiRDBkypMGEnOukr3gncGiq+orfffcdGzZs4OWXX2bAgAE88cQTTJw4EXt7+1ppvdreCQztrGQ8sPIESTnq7PXRm+n8vWgQ8/q34Plfz2uPqdvYlZWVxe+//86PP/7IkSNHAPD29mb06NH/xEdRZ8z5OqoPKsuiqVQqbXD0/vvv89JLLyGVSu9xNPNgx44d/PrrrwbbK0rcCQSVIQJKHYQGV+XUpiRgzk+nmdu/OQ929GVAKw/KypWcjM7k49039JbKdUsC2rZty9mzZ5k7dy7r1q1DKpXywgsvYGNjo91fqVRy6NAhtm/fzvHjx7lx4wanTp3i+PHjfPbZZwDY29sTGBhI586dGTJkCGPHjr3vWQhz11f08/PT1r0ePHiQv//+myeffBJfX1/ChowH7xHafavT2KWxMT0Tk6UNJgESc4o5HZNptA731dffJOLoTu0DiW5Dio+PT32e7n3D3K+j2lKdOtNg60Is3AJ4+anHeOWVVxpqqo2SsLAwo9s1ShuiuUtwL0RAWQGhwWUcXVuucqUKhVLFp3sj+XRvZKWvKVEoWbkvipX7oirdx5gtl729Pb/88gtDhw7l1q1besEkgFQqZcCAAQwYMEBve0REBFu2bOHgwYNcuXKFmzdvcvXqVX755RdAbT/n4+ND+/bt6devH+PGjaN169b3PPfY2Fjmzp3L4sWL6dmzp9F9dPUVq9JW9He24fArgyt9r3UnY3ltk/qBpjHqKyqVSiIiIjh79ixXrlwhMjKS2NhYUlJSSE5O1jZ3abIa5eXlxMXFUXj4IPaT7waU1Wnsir7jGVxxH1A7LhkTnt7513bKUu9mv3VLJx5++GGaNWtGSEgI7du3p0uXLnTq1KlR2RJW9zoCWD+nJz2bGz4kHbiRyuM/nNL+uzFeR/VJTepMY1HhO+crooPdicssNNnPpDbY2Rm3MVWpVFy+fJkOHZr+Spvg/iICSiPoanDVtn7JFDW4/smSAIlEwpNPPlmjY4WGhvLSSy/x0ksvabdlZmaydetW9u3bx9mzZ4mJiWH79u1s376dV199FalUiru7Oy1btqRXr16MGjWK/v37I5ffvTX++usvdu7cyd69e/nwww/517/+ZfC0rtFXvJe2YkZBqV7dqYYBrTyY0NmPQ5Fp2m1V6SumpKRw6NAhJk+eXKPPqCqUSiWxsbGcOXOGS5cuERkZSXR0NMnJyWRmZlJQUGDUcUUul2NnZ4ejoyNpaXfnL5FI8PLy4scff6TPgMG016mhrE5jV0RyLqUKJV46upTa/RyttMGn9v2AqHPH+Ncz8/jjjz8MXhMTE8ONGzfYuXOn0fm7ubnh6+tLcHAwbdq0ISwsjO7du9dbZnvfvn3Y2tpW+lAC1b+ONCRmF7FsZ4TetpTcYr1/m7JOZ0394FWo79tjtzIY+skBUWeqg7Hud4lEQpcuXYw2awoEFRFNOVVQnSdfDZpxU+/UXX8qtl5LAj6Y2OEfD7wVCgV79+5lx44dnDhxgqioKDIyMvRqhRwdHWnWrBnh4eHExsZy4MABbZH6hAkT+OGHH3ByUmfIIlPyGLbiIPZWcva/OIAzMdlVaisaY82sHnT0d6Lbu3soqWAFuuf5/toMrkqlYs2aNSxcuJCcnBwiIyMJCQmp1nskJydz+vRpLl26REREBNHR0SQmJpKRkUF+fr7RwnuZTIatrS3Ozs54enoSGBhISEgI7dq1o3PnzrRt21YbfJ88eZIePXoglUpRqVQsXLiQd999F3t7e6DmjV2peSV8+2gXBrf2ZMSnB7mZpg48W3jYs/PZfqw9Gcu/dVx3gtxsObBoEAC7d+9m5syZJCcno1QqCQkJ0XatxsfHc+rUKS5cuEBERAS3b98mKSmJrKwsCgsLDXywJRIJNjY2ODs74+3tTWBgIK1ataJjx4507dqVli1bVqsOz9/fn8TERBYsWMDSpUsNMkI1vY7Wz+mJi60lIz49eM/3Bv3ryBSoS52pLouGtzLLOtOKFBUVYWur/t2SSCS4u7vzv//9T88WWCCoCpGhrIIAV1t+ntVDW5vz54UYUgr067LMTYPLFEoC5HI5I0aMYMSIEXrbL168yNatWzl8+DBXr17l+vXrRgXVN23axN9//82aNWsYPXq0Vl+xOtqKxvBwsKJXczc2no03CCZ19RVjY2OZM2cOu3bt0o7HxsYSEhJCZmYmZ86c4eLFi1y/fp3bt2+TmJhIeno6eXl5lJSUGHTOS6VSbGxscHJyIjAwEH9/f0JCQmjTpg2dO3emQ4cOWFsbZgcrIzg4GJlMRvPmzfnxxx/p1auX3nhttF6X7Yqgd4g7a2f31C71zuzdjOyiMr74+24pRUWt12HDhnH9+nVefvllvv76a1q2vBsw+Pv74+/vz4QJE4yeR2FhIadPn+bs2bNcvXqVmzdvEh8fT3p6OpcuXeLs2bMGr7G0tMTBwQEPDw/t59i2bVvCw8Pp0qULcrmcpKQkVCoVX3zxBZs3b+bHH39k0KBB2mPU9jqSSSVYyaUUlpYb3wHT0+kUdaa1p7KGJd0MZZ8+ffj999/x8vJqwJkKmhoiQ3kPysrK2LhxI87OzsyfP59bsQl8+fPv9OjV26w1uOoqadJUSgKSkpIICAgwyFppCAoKwv2Jz0kvlvDlI+H0benO02vO8H/j2hvVVjTGrD7BvDWmLdO/P86Rm4YuTIGuNnRL3s7KlStRKBR6gaGFhYXBNlBnGKytrXF0dMTDwwM/Pz+aN29OmzZt6NSpE+Hh4drMYX1y5coVQkJCjNqIajJwGuRSCfMHhTCliz+eDtYkZBfx8/FovcYuUNcSvjqyNeGBLihVKo7dzOC9v65payw1VJaBO3XqFE5OTrRq1apezlGpVHLt2jVtacCNGze0daTZ2dkUFxcbDd6NdcuOGDGCb7/9lsDAQG0Gt7rX0fo5PQkPdEGFCiu5jLS8YtadiuOzvZHaJWBddDO4usTExODl5VWjh4eGJC6zkKGfHKBEoayWF7wGR2s5+14ciLu9FU//coa/Lidrx6zkUvY8P8BkV5aq07DUxlnJf197gvAQXw4fPqxX9iMQVAcRUN6DGzduEBoaqrfN0dGRXr168dJLLzFkyJAGmlnDYw4lAdevX6dNmzZIJBIkEglKpRIfHx86deqEn58fzh7e/I46E1cdbUVjbJnfBy9Ha3q+v9doFkqlUhH38RQ90XcN7u7udOrUieDgYFq3bk3Hjh3p0qULrq6u9fYZ1CfmovWqKS84f/48169f58KFC1y+fLnS/X0Dg7F8ZCUqqn8dfTCxI4k5RVxPzsPWUsbo9t4Ma+vNtouJLFh3zuA9dHU6y8vL2bp1Kx999BGHDx9m5cqVLFiw4D58EvWP5hrq3cJNW2e67WKSts5UIpEY2LoCvP1gW6Z2CcDOSm4QUDbGa6g+qMl3tESlRCWR0reFG0sndmwy39GCxoN4BLkHLVu2xNvbm+Tku18+ubm57Ny5kwceeMCsA0rdkoDVR26yeucpLFx9ANMpCSgvL8fZ2Znw8HDGjBnDyJEjad26tbbs4UpiDr+vPAxUT1uxYlYt2N2Ojv7OfH/4VqVLmhKJhIEPTuHGiX0kJCRopXmkUimTJk3i66+/vn8fQD1jLlqv3t7ejBkzhjFjxgCwZs0aZsyYAaD9/+fq6kp4eDgDBgxA4eDN6jtfMdW9jl7ZqF+OselcAu9N6MAj3QNZdfg25+Ky9cZVwOWYFI5u/5VPPvmEuLg47TJnY9EaPH36NK6urjRv3tzouMYPvrpe8BpaednzaI8gPtsXyYvDQg3GTdEPvsYNSxJ1HfCx25miYUlQK0RAWQ00hcq6tGnThqeffroBZtP4aOnlwPVf/kPixo1MefhR3v7wc5Ox5WrXrh1ZWVmVjpfqLGNXR1uxYkA5PswXgM3nEqqcx0effEpYgDMXLlzgp59+4scffyQzM5OUlJQanU9DY65ar+np6YBammXq1KnMmDGD/v37awO6c7FZrP7qKFC760jD94du8Uj3QPqEuBsElAD9Bw6mNOlu7aGmlOPHH3/k/PnzuLi44O7ujpubG56ennh5eeHj44OPj4/RMob65oEHHiAzM5Nnn32Wt956S9v4pqG2daZvj2nHzivJnLqdWel7m1KdqRDGFzQETfeX/h9i9erV3Lp1y2B7r169zL7GJC8vj//85z/k5OSwceNGAJLioo3qA5oqlvK73b3V0VasyNhOftxMzedyYq7BWMX3kUgkhIWFERYWxrJly9izZ4+BxWFTwBQau2rKjBkzCA0NZeDAgQa6qlD360hDYk4RAM62xveRqIzXAp89e9Zos1FFpFIpMpkMuVyOpaUl1tbW2NjYYGtri729PQ4ODjg6OuLs7Iyrqytubm64u7sbBKeVaX9mZ2ejUCj45JNPWLVqFe+99x5z5szRftdq/OCr4wWvYXR7b7oEuTD04wP4uxh+9hpMxQ9eNCwJGgrzjoiqwfbt241u/+uvv8zePSA1NZXly5frbTt8+DC9evXivffe0+tgNVWaudkh4c5yYjW0FXUJC3Am2N2Oj3br6whWRHLnfXSRy+WMHDmyPk6hQTA3rVc3NzdGjRpV6XhdriNdAu9kajPzDfeRADGXT7Piww/46KOPUCqV2gzlrl276NevH0lJSSQnJ5OSkkJqairp6elkZGSQlZVFdnY2OTk55OXlUVBQQEFBAcXFxWRlZZGSkoJCoaC8vLzay+e6wamVlRWWlpZa6SqlUkl2djbPPPMMr776Ko899hgjHxxPbKa6jjjY3Q65VMJ3j3Vlw+k4lu2M0NaZOtrItXWmVnIpr49uw6rDt4nPLqoyoASIzSikoEShXVUpLi7mt99+46uvvqJv374sW7asWufWUNREGP+ZgS0Y1saLQFdb7K3kJOYUsz8ilc/3R5Gpc42ZujC+oP4QAeU9WLduHVFRUTz++OOcOnUKFxcXOnfujIVF5VkCc6FZs2ZYWVlRUqKfSTl+/DixsbENNKt/FjsrOYGutsRkFrL9YhLPDAzhoW4BHLt1t1t7WrcAysqVHL+l38E9rpN6ufuP8/pLmxUJdLNt0mUDlTGtWyB9WrjXuLGrd3O3JtXYVR1qeh3ZW8kpVSgpLdcP3hbeWZ48oCOQryHQzRYvN2eWLl3KvHnzePnll/ntt98AcHBwwNramuDgYIKDg+t8PsXFxSQlJZGUlERKSgppaWmkpaWRmZlJZmYm2dnZ5ObmkpeXR35+PoWFhRQUFBg9Vm5uLp9//jnf/Lod3ydXAtWvM31mYAssZFI9iamq0PjBWxak8s033/D999+Tk5MDcN+tW+uDmgjjd/Bz4mpSLlsvJpJfUk6Ihz3TugcwKNST0Z8d0lqfmrIwvqB+Mb1fqXrGwsKCNm3aMGbMGE6dOsWOHTvo3r17Q0+rUfDJJ58YBJMAAQEBPPbYYw0wo4ZBo69YXW1FAKkExnT04WxsFrGZxuvhwFBf0dSoqPW6/0YqsRlGZE2acGNXdanJddQz2JXPpnVmy8VEojMKsZZLGdHOm27NXFl7IoYrFUooKl5HzZo149dff+XIkSOsX7+eTp061eu51CY4jYmJoVmzZur5ymSUl5cTHBzMwoULmTBhApGZZcz5Tb2UW506U0W5irn9WvDvLZer1OisSN/+A8m+eR6JRKKVf9LIPiUnJ+Pp6VktIfv65syZM1haWlZqgVjThqWnfzEscTgbm8XXj3ZhaBtPtl5MAkyzYUlwfxAB5T3QiMAW2Xrh0bIzbTt2bugpNRqysrK0Hau65Ofnm1U5wPQegaw+Fg3AG5svkZhTxJQu/gxv601CdhH/t+2KgbZi3xB3PBys+Xz/zSqPXa5U8WjPprGsWxdaejmweGw7FtOuUuFlU6cm11F8dhEnozMZ0dYbDwcrlCoVUan5vL7pEmtPGq4OVHYd9enThz59+tzP06o2uhnKAQMG8OKLLzJy5Eht8FZgmQOoA8rq1Jk+P6wVybnFHLuVgb+zeqnbw0HdWORmZ4m/sw0JOUUGAVdBnjojqauop1Qq+fPPP/Hx8QHUAaamhtTe3h5HR0dcXV3x8PDAy8sLPz8/AgICCA4OpkWLFvj4+NQ5CH3kkUeIjIzk6aef5p133sHFxUVvvK4GCwDxWeqHW0dr/RU4U2pYEtw/hA6lEaojAjso1JPpPQJp6WXeT2xFRUU4OTlpPZ4HDBiAk5MTmzdvNpuAEsxHX1FwfzHn66i8vJwvv/ySwYMHG/WOLihRaP3gXx4RyjMDQ3j4u+N6ZQG9mruxbk5P/rX+HI90D6Rn86qXqTsu2Ulu8d0HYgmw9+kw3n7jVdasWaPNTEqlUoYNG0bLli1JSkoiPT2dzMxMcnJyyM/Pp6ioiNLS0koNEEAdhFpYWGBjY4OdnR2Ojo64uLjg4eGBp6cnfn5++Pv7a4PQgIAAvSDUxcWF7OxsZDIZjo6OfPTRRzz++OPafWoqjK89rq0FcqmUZu62vDKiNWEBznpWpxoqE8YXCDSIgFIHcxDqvh80a9aMmJgY3njjDd55552Gnk6DoOveUV+YunuHwBBxHVWNJmiqjhd8oKstrnb63eStvBxYNDyUrw/c5GxsFvuup+q5CukGTYcPH2bevHlcvaqu0fz++++ZNWvWPeeYkZHBzZs3uX37NjExMSQkJJCUlKStIdUNQktKSqoMQiUSCZaWllhaWpKXl2cw7uvryyuvvMLg4aN48McbNRLGB/Cwt+LUG0O1/07MLuLdP6+x/VKS4Vy4K4wvEBhDXBl3qKkIrGb86K0MsxSB1V2WbNa5L2lZufzf//1fQ0+rwTBXfUVB/SKuo6qpSZ2pbs2yhtwi9UrKhfhsdl3V13CtWGfat29fLly4wFdffcXy5csJCwur1hzd3Nxwc3OrUa19bm4uUVFR3Lp1i9jYWOLj40lOTiY1NZXMzEwyMjKMBpSJiYk8++yzWHiuqHHDEkB2USnTvz+OlYWMdr6OjGznja2lzOB94G7DkjnJwglqhggoESKw1aXSUoDWD+MROo1BHx0w61IAc9RXFNQ/4jqqnNrUK1cXY3WmcrmchQsXsnDhwjrOvGocHR0JDw8nPDzc6LiuBbCmYcnLy4uJEyfy4IMPkq6y561D6kasmgjjl5WrOHJTXTKw73oqR6Iy2Ph0bzIKStl3PdVgHqX1mDkXmB5mH1AKEdh7U61SAImEmMxCfj4Rw+pj0WZbCmBu+oqC+4O4jozT0suBfiHuHL2VgUKp4tO9kXy6N7Larz9+O5NmrxlqC2vqTBtrF7NGukgikTB48GDmz5/PAw88oBV8v5KYA4fUFrB1EcY/G5tFSm4x48N8jQaUugL8AkFFzDqgjMssxFImJXrpA5Xu02PpHlJy1TeihUzCnH7NmdTZH38XG3KLFVxKyOH1TZdIzlUL7pqaCKwoBag5BvqKEiiv4mMzZX1FQe2peB1JUKGi8kY3c7mOzMUPXpewsDC++eYbhg4datTnvL6E8UFdc+tgbRh0GjNYEAh0MeuA8vVNlygqK+dgZLredokE3h3fnvisIm0wKZdK+O/j3egS5ML6U3FcS8rFycaCsABnHKzlJN+RfTMlEVhRClB7dPUVl/yyj/0RqVi6+pqlvqKg9gS42vLx2OYEtJ/G4Ln/psCpmdnqdGowxzpTCwsL5s6dW+l4TYXxbSxkqFBpl8c1jGznjbOtJRfjcwzew1QNFgT1h9leHRoRWIDTMVl6Y12DXLC1lLP5fIJ226y+wfQIdmPKN0e5YORm02AqIrCiFKBuxMfH89133xESEsJf7z5HZmYmWXmFJOSWmp2+oqD2lJaW0qtXL0pSo+lvl8Kri54wW51OXUSdqSE1aVhq6+PImlk92HYxkZtpBShVKjr6OTG+sx9xmYX8cPS23rFN3WBBUD+Y17eQDhoRWGPLJuPC/FAqVWy5Y4knkcATvYPZdTWZC/E5yKQSLGQSg6c7DU1dBFbjB/vh5I5M7hJQ6X6acoD1c3oa1Xs7cCOVx384BZheKcC9OHXqlEHXe5dO7Rk8eDBLlizB19e3gWYmaAokJyeTlZXFG2+8wc2bavF7jd2rnZVcdNoi6kwrUpOGpaScInZcTqJ3C3cmhfsjl0lIyC7ip2PRfL4/iuzCMr1jm4vBgqBumG1AuT8i1egXkFwq4YEOPpyJzSI+uwiAlp72eDtZcy0pj/cmdGBSuB9WchnXknL5v21X9ZYVQH3z7b+RymLuBpRlZWVs3LiR1atX8+qrrzJgwID7e4J1QOMHu/ZkLIej9M/NWDkAqPXLlu2M0Ns35U5dKZhWKUB1MPb/99atW9y6dYvHH39cBJSCKnnqqaf4448/9LZp9BAFdzGoM1UpUUkqbxwx5TrTmjQsZRWW8frmy9U6bmNvWBI0HswyoMwvUVTqn9y/lQeudpZ8vPvucnfwnULkWX2DyS4q5Y1N6hvxmUEtWP1EN8Z9cYTryfoaYbEZhRSUKCjOz+G7777j008/JTk5GYARI0Y0WECp0bGvzMVGtxTgbGw2Z2Oz9caNlQMA5BUrDLbpYiqlADXBwsJC6yCkYcGCBfTt27eBZiRoCqhUKiIjDQOBH3/8kWbNmvHWW281wKwaLwGutjzVWsGGV55m2DP/R75jkNnWmZpjw5Kg8WCWAWVMRgGV3W7jOvlSqlCyTccpwPZOfZKdlYwHVp4gKUedeTt6M52/Fw1iXv8WPP/reb3jqIDuQx4g4vheAycEW9uGeyqeOnUqp06dYsWKFYwbN84gsKyqFAAMywF0kUklWMmlFJYad35o6qUA1UWpVDJjxgwDj3OARYsWNcCMBE2JTZs2Gc1GlpeXc/r06QaYUeMmLi6OESNGUFZQwAj3XP71r0FmW2dqjg1LgsaD6d9hRqhMnNXWUsawtl4cjEzTqyEpLlMHSGdisrTBJEBiTjGnYzLpEuRi9HhRt6KN2mrNmzePefPmIZVKkclkWFhYYGlpibW1Nba2ttjZ2WFvb4+joyOOjo64urri6uqKm5sbnp6eeHp64uPjg6+vL66urnp+r/fi+vXrxMTEMGHCBPr3789nn31Gp06dtOOVlQKA8XIADcHudlxdMgIruYy0vGLWnYrjs72RerZmxkoBTJHExER27tyJMVfT/fv3M3PmzH9+UoImw/Dhw3niiSf44YcfDMaWLVvWADNqnLz77rt8/vnnFBQUUFCglscpLVVL4phznaloWBI0FGYZUFYmzjq8rTe2lnL+qLB0q6kVrCgUC5CRX1rpF9dz/1rAN++/RW5url5wMWzYMOzs7MjNzSU3N5f8/HwKCwspKioiPT2dxMREFAoF5eXlRoOSikgkEqRSKXK5HEtLS6ysrLTBqb29PQ4ODjg5OeHk5ER0dLT2dYcPHyYsLIwpU6awbNky3H38Ky0FAOPlAAAxGYUcu5XB9eQ8bC1ljG7vzb8Gt6S5ux0L1p3T21dTCmDK2QJ/f38iIyM5efIk06ZNA8DJyYmcnBxtg4VAUBn29vYsXbpUL6C0t7dHLpdjY2PTgDNrXMTFxWnLiDT88MMPDBo0iC5dujTQrBoHomFJ0BBIVNWJWEyMghIF7RfvNFj2Xj2zG12budL13d16Hdx2ljLOvTWcc3FZPPTtcb3XbJjbEw8HKwZ/dEBvuwS4vHgEytIi3n//fZYvX055eTlKpZKjR4/Sq1evas83NzeXhIQEkpKSSElJIS0tjfT0dDIyMsjKyiI7O1sbmBYUFFBYWEhxcTElJSWUlZWhUChQKu9tmWUf0Bq36R9WOv7pQ2GMau9D96V7DLoAK/LehA480j2QCV8e4Vxctt7Y9oV9TTZ7UHGprV9Ya1wcbLl58yYZGRm4uLjUKKMsME9UKhWWlpYoFApCQkI4fvw4bm6GSgrmSlJSEh07diQ9Pd1gzM/Pj/j4+AaYVeMjLrOQ1zZd4nBUOlIJVBVXakqdzNXlTFB3TDdNVAW6IrAaXO0s6RPizpYLiQZyQAWl5fwdkcrg1p608LDjZpp6eaWFhz1dAl1YezLW4D20IrBWDrz77rvMmTOHl19+mc2bNxMQULkUjzE0S99t2rSpxdneRaFQYGtrq20UkUqlKJVKPDw86N+/P616DWet4fczUHk5QGV8f+gWj3QPpE+Iu0FAqVtykJeXx65du/jjjz9wdnbms88+q/X5NRSVepwDDk9+h4NFOYu3XGF6j0DcRDApqAYSiQSJRIJMJuPQoUMimKzAn3/+aTSYBFi9evU/O5lGTICrLdN9M/n1laeZvvhrbhXbmG3DkuD+Y5YBJdwVgdUsBYzp6IOFTGqw3K1h2a4Ieoe4s3Z2T1YfjQZgZu9mZBeV8cXfUXr7GhOBbdasGb/++itlZWVaPbl/GqVSqRdMTpgwgeeff57evXsjkUi4kpjD2pWHjb62snKAykjMUddYOtsanmt6SjJfblvHpk2b+Pvvv7XNK6GhobU5rQajOh7nEomEbIXc7D3OBVVTMbPtKClBoVCwYsUKvL29G3p6jY4nn3wSd3d3xo8fbzDWs2fPf35CjZSkpCQmTJhAWUkJX88ZgpWVldk2LAnuP2Z7FemKwAKMD/MjLa+Ew1HGn3qjUvN56NtjvDqyNQsGhaBUqTh2M4P3/rqmp8cIVYvANlQwCSCTyRg7dixt2rRh/vz5BplSXT/YiowP8yW/RMHuaynVeq/AOwFTZr6+b6xKpWJEn3BUZcV62yUSiV5zUGNHeJwL6kpVmW0J0Pql9ST7tiQyJY+WXiJrpItEImHs2LHIZDLKy8uRSqVMnDiRoqIiLC0tG3p6Dc5rr71GXl4emzZtoqRE/fuUmppKQECAWTcsCe4vZllDqWHGqhMcvZVRr5pdGhHYpirgPWD5fr1SAFCXA5x4bQhbLiTy4m8X9MbsreSUKpSUluuXCayc1pkHO/nywMpDXEnM1W53t1IS//UcUlKMB6a2trb4+vrSunVrevbsyfDhw+nSpUujqjusi8e5LouGtzI7j3NB9TLbGkRdW9VYWFigUCjYvn07o0ePbujpNBrc3d3JyNA3pVi/fj0PPfRQA81IYA40nl/pBuC9CR2QS40LfNeWpi4COyjUE1mFz6SqcoD2vo4cfnkQbz7Qhkd7BjG7bzC/zevFg518WXsiRi+YlEkljAlvTlJSEh9//DFyuVwvUOzatSu+vr4kJSWxbds23nzzTbp3745MJtPWkE6ePJmPPvqIK1eu3L8PoQrq2+N8wynD+luB6bL+VCxDPznA0TvuWjXNbK834+uloETBlcQczsVmcSUxh9TMHCQSCVOnThXBpA5RUVHk5uYabJ82bRrLly9vgBkJzAWzzlCC+gu+PkVgP5jYoUlLLUSm5DFsxUG9bRuf7k2Aiy09lu4x6BL0d7Hh1ZGt6eTvjIeDFUqViqjUfNafijParLTn+f7aou8zZ84wadIkYmJi1O8dGUlISAigbiA6cuQIe/bs4eTJk9y4cYPk5GSKi+8ulUskEpycnAgICKBDhw706dOHUaNGERwcXKtzLywspLS0FGdnZ6PjcZmFDP3kAO+Ob18tj3NdHK3l7HtxIO72Vjz9yxn+uqyWO7GSS9nz/ACReTIDRGa75tyrLECVn8akXq15akg7URZwh379+nH4sGEtvEwmY/fu3QwaNKgBZiUwB8w+oIT6+6J/aXgo8weF1MOMGpZ/shQgNzeXp59+mmPHjhEZGYlMJqvyOMXFxezfv599+/Zx5swZIiMjSU1N1Qoag7rhyMXFhWbNmtGxY0f69evHqFGj7tncsGDBAlavXs13333Hww8/bDCu+Vw6+TsR6GqnN6brcT68QkAO8PaDbZnaRV2/pBtQNvUSCUH1EA+uNUOUBdSes2fPMmvWLM6fP6+3ffjw4ezcubNhJiUwC0RAeQfdJgtzF4HVZOJKKnEUqg33OxOXm5vL7t27OXDgAGfPntXqPup6acvlclxdXWnevDlhYWEMHDiQESNGaDOSnTt31n4JP/HEE6xcuRI7O3XgaCxzq0vXIBd+f6o3y3Ze58u/9cXLW3nZs31hPz7bF8mLw0L1AkoNuplbgWlRk8x2TlEZU7oEMKytF629HLC1khOTUcC6k7GsPRmrXSEw5cx2Xb+LRcObWjrpiSeeANQP2FKplEmTJrF+/foGnpnAlBEBpQ66T8UqZTkSaeXZMlN/KjaVjEp6ejo7duzg4MGDnD9/nujoaDIzM/UsMS0sLHB3dyc5OVnrTCSVSmnevDm///47nTp1YvGWK3oyUxX5z7j2TO8eSP/l+w1sKX+Z1YOswlLWHI9h/dxeBgGlTCphRo8gk/c4N1dqktlu5WXPjn/158jNdA5FppNfoqB/Sw9Gtvfmf2fjtU1xpprZFmUB9cOWLVsYN24cUqmUw4cP07FjR+RyOVZWVg09NYEJY7ayQRVJS0vj4/feY0C7diRc28f5AgfaDplMQk6pWYrAmoofrLu7O48++iiPPvqo3vbY2Fh27NjB4cOHuXTpErdu3dKzuVQqlURFRREWFka/fv0oHPIK5ZUkbKvyOB/d3psuQS4M/fgA/i7GbfPMxePcHIlMyePQHSmys7HZnI3N1hvvGuSCraWczXca3tLyShjx6UEiU/O1+6w9GcuySR2Z2jWAz/ZFEpNRSLlSxaGodKJS80zmO6i+G9487K1MZtWoKozpSmpUNL777rsaubIJBHVBBJR3iIqKYsWKFXrb7GUxPPfgePqNnohEZmF2IrCm7AcbGBjI3LlzmTt3LgBbt25l7Nix2nGJRKINMI+dOodvbxUSiXFFgMo8zq3kUl4f3YZVh28Tn11UaUAJ5uFxbo78ciK2yhrAcWF+KJUqtpxPBCCrsIwsI05UO68kM7VrACEe9sRkqGW9ZFIJa47HGs1sK5VKVCrVPWuSGwtxmYW8veUKH07uWK2Gt34t3RnTwZewAGdCPO1Jyimi77L9evv+e8sVerdwN7nVI7h3s5KN0om2M96m3wNTGmqKAjNE/HrdoXPnzlqRXA07d+5k586drFvnzLRp0xpwdg3HtG6B9Gnhri0FkKiUqCSVq01pfjx7N3drUqUAV69e1f7dxsaG0aNHM27cOEaNGkVKiQUPfG7cQQhgXCdfShVKtl1K0tv+zMAWWMikBk5KxlAB0RkFJis4bK7uHPsjUisNJqvKbFfEw0G9VJlVeLf5zFhmOz8/nx9++IEPP/wQd3d3zpw5Uw9ncf95fdMlFEoVa0/GcjhKXz9RtyxAo54wrpMvYzr6cjkhh5TcYmOHRKFU8fqmSyZVFlCdZiUVUCi1Q+bfjWErDppsWZag8WH63+jVpLi4GLlcrhdQAgwbNozJkyc30KwaBwGutvw8qwcrf/yNt9fsofWgSSTllZlUKcDQoUN54YUXGD58OAMHDtSrNYqLzar0dZV5nPs72zC3Xwv+veUyhaXllb5el9IKTVDx8fFs3bqVPXv28Pzzz9O3b98anlXDcq8sSqCrLYNCPZneI7DJSr6oVJVnrvNLFMRWMAnQpbLMdkUsZBKe7BNMbGYhF+Jz9MY0me2stGRWrlzJV199RX5+fqPKTv73v/8lJCSE/v37Gx2vaVkAwLKdEby6UR2Ernq8K6FGrh9TKwuosTvXnWHhziX4pxABJVBWVsbEiRP1pGdA3RX822+/IZeb78eUk5NDTk4Orq6uvPzUY5SUlHBk19cUlpabVMapS5cudOnSxeiYpbzyjGxlHufPD2tFcm4xx25l4O+sXurWZJnc7Czxd7YhIacI3Za4spIizpy5xdatW9m4cSOXLt1tiho8eHCTCSirm0WJySxs0h7nJSUl+Pj44Ofnx9SpU5k0aRJt27bVjsdkFBi1MdVQWWa7IkvGtqeVlwMzV580+CxVQHCH7qRFnjN4XX5+Pu+99x4uLi64urri5uaGu7s77u7ueHp6/iMWhUqlktmzZ6NSqRg7dizLly+nVatWevvUtCwAIDWvxOi+FamqLKApUZdmpfI75UqvbrxEen6JWTcrCe4vTTcCqEd2797N/v37kUqleo0ZCoVC64NqrixcuJCff/4ZGxsbrah4Wloanp6eJrs8W5HaeJz7OdsQ7G7H4ZcHG7zmnfFqJ6WOS3aSW6wA1Jmunu1aGHica2jfvn2dzuGfwpw8zi0sLCgsLOTy5ctcu3aNf//734SEhDBx4kQ6dOhApsQRMJ4lrCyzXZG5/ZrzSPdAPtwVwd8RaUb3yS0wngVNS0vjjTfeqPIcJBIJUqkUuVyOXC7HwsICS0tLrK2tsba2xsbGBjs7O+zs7LC3t8fR0RFHR0ecnZ1xdnbGxcUFNzc3bbDq5eWFo6Oj1gGrsLBQ+536559/sn37dp566ikWL16Mu7s7UH9lAcaoquEtIiICJyene+rTNjSiWUnQVBABJTBy5Ej++OMPtm/fzrfffqs3dvr0abO29fLy8gKgqOjul3lAQAAzZszg+++/b6hp/aPYWckJdLU16nHeJ8SdLRcSKS7TX67+cFcErnb6GaBWXg4sGh7K1wducjY2S28p3NdBTt8pE1m/fj1KpWE7+dChQ/Hw8CAkJIQuXbowaNAghg4diq1t48nomVMWRalUcvnyZZydnUlJSdGWykRFRbFs2TIALDyD8X1ypdHXV5bZ1mVyuD+vjmzNmuMxfL6/8jrcY0cOsff3H1myZAlFRUXaufTr148PPviA9PR0MjMzycrKIisri+zsbHJzc8nLyyMvL4+CggIKCgooKiqiuLiY4uJi8vLyyMjIQKFQUF5eTnl5OTVVmNPoH2pQKNQPT1988QVffvklnTt3ZsyEycQWdKz0GNUtC6gK3Ya3kpISNm7cyOeff87Ro0eZPn06a9asqfWx7zc1bVYCCA904bVRrWnv60R+SRnbLiWxfGeE9vvGlJuVBA2L2QeUmmaBgLB+PBEaznc//MSDo4bz1FNPcf78ebp169bQU2wwVCqVgdsCQGlpKdHR0f/4fBqSQaGeBjqUVXmcn44xrLvMLVJnoi7EZ7Pr6t2MpkwqYUSHABa/8QvvvfceDz30ECdPntT+gFtZWdGmTRtiYmI4cuQIhw4d0ioSWFlZ4eXlRatWrejatStDhw6lX79+/8hypi6mmkVJT09n3759HDt2jIsXL3L79m1SU1MpKCio9DVSqZSpU6fyzvvLGfr1hRpltjUMa+PF+xM7sONKMm9tuVzpe0mAVj4udF60iJkzZ7JkyRK++uorysvL8fb2rnfJmLKyMtLT00lLSyM9PZ309HSysrLIzMzUBqqaPwUFBaSnp+uVbmhQqVRcuXKFLOxQDa88oKxuWUBVqICjlyLZ97+f+Oabb8jKykIqlSKRSP7x+6Sm1LRZqa2PI2tn9yAqNZ93tl/F28mauf2aE+xmx8zVpwDTbFYSNA7MMqCsqlkg4IXfSHOy5ESZH9Of7IuHR9Mv5q4tK1asYM+ePQbbnZ2d+d///tcAM2o4pvcIZPWxaL1t48P8SMsr4fCdhoLaUq5U8WhPdfAUFBTE4cOHefvtt1m6dCkqlYrevXuzb98+7f4RERHs2LGDI0eOcOXKFeLj49m7dy979uzh/fffB8DW1hYfHx9CQ0Pp0aMHI0aMoFu3bnoZo+qSnJyMhYUFbm5uRsdrmkV5ZmALhrXxItDVFnsrOYk5xeyPSOXz/VFkFqjrmP/JLIpCoeDEiRMcPHiQs2fPEhERQUJCAjk5OXpNehKJBHt7e3x9fWnRogVhYWHcunWLjRs3olAokEgkdOjQgQ0bNtC6dWsAAl0ja5TZBujezJWVD3fmZHQmz204T1WJwUA3W23tsru7OytXrmThwoUsXryYESNG1MOno4+FhQU+Pj74+PhUa/+LFy/SqVMnQO0lLZFIePjhh3nhhRcICwvjXGwWE746avS11S0LqA5jxo6nNOnuA49mFWD37t1MnjwZLy8vfH19CQgIoFmzZgQHB+Pn51er+6W6rF27lo8//pj333+foUOHGozXplnppRGh5BSVMe274+SXqDPC8VlFfDCpI/1aunMoMt3kmpUEjQezCiir0ywgkUhIzC1r0s0C9YWdnR2urq5kZmbqbffx8cHJyTzqJzW09HKgX4i7nsf5xEp+CCvj+O1Mmr22XW+bxvFE94tdLpfz7rvvMnjwYKZPn86gQYP0XhMaGkpoaCjPPvusdptSqeT8+fPs3LmT48ePc+3aNRITE7l58yZ//vknb7/9NgAODg74+fnRtm1bevfuzYgRI2jXrl2lncoAEydO5OrVq/z00096Wp0aappF6eDnxNWkXLZeTCS/pJwQD3umdQ9gUKgnoz87RFFZeZVZlAsXLvDUU0+xYMECpk+fXum8KxIbG8vevXs5ceIEly9fJiYmhvT0dG1tsAYrKytcXV3p1q0b7dq1o3v37gwePJiQkBCDY65Zs4Zff/0ViUTCK6+8wpIlS/SyXjXNbPs52/D9Y11RqeDPy8mM7qAfuF1PzuV6ch6gvnYGtfI0OEarVq1Yu3ZttT+X+4kmcHN0dGTBggXMnz8fX19f7XhtGt5qg4uTAylGkpwJCQlVPhxr6kutra2xtbXF0dERJycn3Nzc8PDw0DZlBQYGEhwcTIsWLbC3t6/WnA4fPsyZM2cYNmwYEyZMYMWKFQQG3s3K17RZyd5KTt8Qd1Ydvq0NJgE2novnrTFteaCDD4ci1QGqqTQrCRoXZhNQmlOzQH0xd+5cZs+ejYeHB5mZmdqmpbQ0480Bps57Ezow9JMDNRJ4vxdyqYT3JnQwOjZkyBCSkpKqVbsmlUoJDw8nPDxcb7tCoeDo0aPs2bOHkydPEhERQXR0NNevX2fjxo0sWrQIiUSCk5MTAQEBtG/fnr59+zJq1CiCg4NRKpWcO3eO4uJixo0bx8KFC1m+fLlWVqk2WZSnfzlrMP+zsVl8/WgXhrbxZOvFJKNZFKVSyccff8xrr72GQqEgODjYIKAsLCzk0KFDHD58mHPnzhEVFUVycjJ5eXl6talSqRRHR0eaN29Oq1at6Ny5M/3796d37941WgYdPHgwo0aN4tVXXzUqi1PTzHaAiw2ONhYAvDPOsBFrxZ4b2oBSN7PdWOnUqRN79+6lR48e2NnZGYzXpuGtpkiAm+ePc2DvLp555hliY2O199Q333zDrFmzSEtL4+bNm8TExBAXF0dCQgIpKSmkpaWRmZlJTk4O+fn5JCQkcPv2bRQKRZX3pUwmw9LSEhsbG+zt7XFycsLZ2VnbuOTr68vp06e1Bgpbtmzhzz//5K233mLRokVYWVnVuFkp1NsBC5mUSwn60lJl5SquJubqNVEKdy7B/cAsAkpzahaobzRP6ADnzp3Dz8+P3NzcBp5VwxDgasuSse3q1eP8/8a2qzL7LZFIqswe3gu5XE7//v0Ngp3i4mL279/Pvn37OH36NFFRUURERHDp0iXWrVsH3A26dDN4K1eu5O+//+b333+nVatWtZJ8MUZ8lnpZ2NHaQrtNN4sSFxfHo48+ysGDB7XjBw4c4PHHH+fq1avExcWRmZlJWZn+0qiNjQ0eHh6EhYXRoUMHevbsyZAhQ+qts9fX15c///yz0vGaZraNZbGNYSyz3RiRSCQMHmyodKChNg1vNUVTFjB69GiuX7/ORx99xH/+8x9KSkpwc3NDKpXi5eWFl5cXvXv3rvZxS0tLuX37Nrdu3SI2Npb4+HiSkpJITU0lIyODrKwsbT1pamoqpaWlRhvuAG3j05tvvsm///1vBg0bSUznp1GHw4YYa1byvCNLlppnqBSRmldM92auetuEO5egvjH5K8lUmwXuF8YcTaytrXn00Ufp2FFdPF9ZLZ05YCoe59bW1owaNYpRo0bpbc/NzdXKaJ07d07PQUjDpUuXCA0NZejQoWT1fZZypfEfvXtJvrjYWiCXSmnmbssrI1qjKFdy/PbdJfNypYqdl+K5+dv7rFu3zsB0IDExkZ9++gm5XI6zszPt2rWjdevWdO3alQEDBhAeHn5fa+Cqyz+d2W5q1LQsAKC1twND26gVKJq52uFgbcGCQeqShGtJuey9ngoYlgVYW1vzxhtvMGPGDFatWmW0drG6WFpaastPakJ6ejo3b95kypQpxMXFGYzb2dlRZu1MZcEkGG9WsrZQS1RVNEgAKFEoteMaTN2dS/DPY9IBpaZZoJmbLS8OC6VrMxecbSxJzC7ijwsJfHvolvbptzqNAmCakgv3cjSxn/YhLm29iUzJa7KOJvWJKXucOzo6MmnSJCZNmgTA0qVLefPNN7WZFV2P8xNnL+DSRV0naYyqJF887K049cbdH/PE7CKe3XCem2n63dOJeWWc2PA7qnLjbkPXrl3TNsA0Vhois92UqE3DW3tfJxYN1w/kNP/+/UycNqCsrCwgMDCQJUuW1MPsa45GXF4jo6TZ9vTTTzNnzhwCAgJq1axUXKa+R4zVpVrJpdpxXYwFnwJBbTHpgPL1TZfwcLDij/l9ySsu46djMWQXlhIe6MILw0Lp4OfEnJ/VXrfVaRQA05JcqK6jSYHUlu038thyXfjCajDwOEeFqoqMQlP1OL9+/bo2mAwKCmLSpEmMHTuWPn36EJFawAMra+5xDpBdVMr0749jZSGjna8jI9t5Y2tpKAIukUjYffw8+XHX+f3339m8eTP5+flIpVKUSiVJSUmNPqAE08ls3w9q0/D2+9l4fj8bX+U+jb0soFWrVrRs2ZIFCxYwfvx4LCzulnvUpllJ4x7k6WBt8BpPB2tSjLgLVfU+AkFNMdmAUtMs8MzAFjjZWDD566NEpuYDsO5UHFKphEnh/jhay8ktVlSrUQBMxx9WNCnVHY3H+cWYNIbMexuf8KHkqaxMyuN81qxZdOjQgTFjxhAaGqpXz1lVduNeki9l5SqO3FQvb++7nsqRqAw2Pt2bjIJS9t3JLmlwdfdkSHgo48aNo7S0lH379vG///2P/fv34+joWE9nev8x5cx2XTHHsoC///670rHaNCvdSM6jrFxJBz8ntus8xFnIJLT1dWT7Rf0HO8md9xEI6guTDSg1zQIOdwqO0/P1n85Sc4spV6ooK6/8C8xYowA0fckF0aRUdxITE2nfvj0dO3bk9u3bpMfG8uljfRk3aaxJeZwba+jRUJ+SL2djs0jJLWZ8mK9BQKn7PpaWlowcOZKRI0dW67iNjYqZ7aoamqDpZrZriigL0Kc2zUp5JQqORKUzobMfK/dFUnDHGWdCZ3/sreT8eVk/oNTVMBUI6gOTzXdrJBeO31ZrKC6b1JG2Po74OFkzpoMP03sGsfrobe1StgYXWws87K3o1syFxQ+2M2gUgLuSC02R+m5S2nAqtl6O1dSQSqVkZWVx4MABYmPVn8Err7zC8qXvEGAvoXOgC+18nUz6C1uTRTFGbSRfrORSHCo8vJliFiXA1Zb/PhbO+sfa82iPQMpzkqmoXi4BgtxsmdEjiD3P9+fnWT2abHBUXaZ1C2TR8Fb1cixTKAsYFOqJTKp/h92rWWn5rgicbSzYMLcX07sH8uKwVvzf2HYcvJHGgRt35d4q0zAVCOqCSf7a5ZcoiL3zZHfgRhof7opg/sAQhrW9KxWycl8kH+3WD6yq2ygAhpILaWlpfPfdd/zwww+8++67TJ069X6cWp3QNCkB92xUsraQMqVLAMPaetHaywFbKzkxGQWsOxnL2pOxaJIqptikVB28vLywtLSktPRuw1Z8fDxLliyhTZs2PPTQQw04u3+G2mRRbCxkqFAZbB/ZzhtnW0suxutr6JlqFmXBggV8++23WFlZUVJSgtzajoWv/x+hbdrRt3fPJp/Zri2iLOAutWlWupKYy/RVJ3h1ZGveGtOW/BIFG07HsWzHdb39moKGqaDpYZLfWDEZBXq1J/FZRZyMzuCvy8lkFZYxONST+QNDSMsv4adjMdr9qtsoAHclF4oSI/nss89Yt24dSqUSpVJJTEyM0dc0NBpHEx8n63s2KgW62rLkwXYcuZnO93ecF/q39OCd8R3oHOjCi79dAEyrSakmfPjhh3rBpIYnn3ySKVOmNMCMGoaaSr4Eu9uxZlYPtl1M5GZaAUqVio5+Tozv7EdcZiE/HL2t3deUsyjt2qnLZUpK1KU4iuICPvn3i0gkEjIyMswymNRgLg1v96K27lynY7KY/M2xSscbe7OSoOlikt9aus0CD3b0YemEDgz66G+Sc9WCrzuvJCOVwKsjW7PlQqK2aaAmjQIAffoNIOfWBT0pFVDX1127do2AgIBq23DVlRs3btCtWzdmz57Nv//9bwNrRF1Hkwmd/e7ZqJSWV8KITw9qxwHWnoxl2aSOTO0awGf7IonJKDSZJqWasG3bNl5++WWD7XZ2dnz77beNQvvwn6KmWZSknCJ2XE6idwt3JoX7I5dJSMgu4qdj0Xy+P0qvgceUsyhjx47Vs87U8MILL+Di4tIAM2pceNhK+WRcC7LK2zLkqcXI/DuCvbtJNbxVB3NsVhI0XUwyoNQt4n+0ZxBXEnO0waSGPddSmNI1gHY+jtogsiJVNQoAFOarHWMqWnCtWLGCFStWaP8tlUqxsLDA0tISa2tr7OzssLe3x9HRERcXF9zc3LSWXN7e3vj5+eHv709AQAC2ttV72o6IiCA3N5cVK1awevVqli9fzsyZM7XBja6jSXUalXKLFWQZ6c7deSWZqV0DCPGwJyZDvdTZ1JuUakpwcDCDBw9m//79ev/vi4qKUCgUyGTGs9qmSE2zKFmFZby++fI9j2vqWZRffvnFYJuNjQ3vvvtuA8ym8fHEE0+wfv16XFxcyMrKwtramm07duMc0BKp3NIkGt6qg2hWEjQlTPJu1JVccLe3IrfIMDCSy6R6/60MY40CoH463vvHehY9u5CTJ0/qjT399NM4OzuTlpamteDKzs4mLy+PgoICsrKySE5OpqyszMD9wxiagNTKygpra2tsbW1xcHDQBqSurq5af22lUklmZiazZs3i008/5auvvqJ37956vrDHb2fy9EB1o9IneyLJKiylS6BLpY1KunjcsffKKry73GtuvrDt2rVj7969vPvuu7z55pvaoL+wsJCsrKx6s/VrKogsSs24du0ab7/9tsH2oqIiMjIy8PX1bYBZNS5atGgBQFZWFqC2Ch06sB+enp4kJSWZ1SqA0DAVNBVMMqDUbRa4nV5Av5buBLvbcTv9bnPN2E6+lCtVXEvKrXGjAKiXWvr17M7x48dZu3YtL7zwAqmp6izmE088Qbdu3ao939LSUpKSkoiNjSUhIYHk5GRSUlL0AtKcnJwaB6QXL16kT58+OLh64Drnv1pLk5o0KuliIZPwZJ9gYjMLuVDhMzF1X1hjlpQSiQS5XM6tW7dwcXEhLi7O7IJJEFmUmmJlZcWAAQO4cOECGRn6qyM7duzgySefbKCZNR7Cw8ONbh8zZoxZBZMaRLOSoClgmr/+3G0W+PbgLQa28uDXub346Xg0WYVlDGntyaBQT9adjCU1r4S2Po7VbhQA/WYBiUTC9OnTGTduHEuXLuXXX3+lefPmNZqrpaUlQUFBBAUF1epcS0tLefXVV/nss8+0AaZGgNrHx4d+Yx/meAV/vOo2KumyZGx7Wnk5MHP1SYMvNGO+sBEREWzevJl9+/axbNkyOnXqVKvzayjuZUnpIG1Nn4UryMUWL0tLbVbFHBFZlOrTvHlz9u7dC6hXH2xsbPjuu++Ijo5m0KBBDTy7hqesrIyPPvrIYLu3tzdffPFFA8yocVCxWQmVEiSVB9em2qwkaLxIVBULAE2EyJQ8hq04CEAnfyeeG9qKdj6OONtaEpdVyP/OxvPNwVuUK1W42Frw0vBQuge74eNkrW0U2H9d7eVtrJZwz/P9G1V914svvsjHH38MgJubG/Pnz2fevHn4+voa+MI+2NGHZZM66TUqASyf1JEHOvrQ+4N9Bu4mc/s15/XRbfhwVwSf748yOoff5nSHjGg2b97Mb7/9RmRkpLZhadOmTYwfP77+T/w+UB1LSg2acWFJqUbXgUlkUYyjyXaXKJQM7NuHVxfO4vWXXmzoaTUaPvjgA1599VWD7R07duTChQsNMKPGw5EjRwgKCuLczSQef+d7AnuMIqfcwuyalQSNE5MNKAFmrDqh1yxQH2iaBRqbTM7PP//M999/z7x585g8eTKWlpbasSuJOXqeyxvm9kQmkRhIS4xo68U3M7oy/fvjeo1Kk8P9WTapI2tPxvLmH5U3VCT+dyFlqbeNjl27dq1JeC7XNSASlpTqgPzxL3Zyq9ASqQSq+hjNJSC/V7Y70NWWQaGeTO8RSEsv8w4ADhw4wPLly9m3bx9FRUXa7VKplOzsbBwczPPzyczMxM3NDUDrZT9r1ize/eBD0kskJuPOJWi6mHRAGZdZyNBPDlBShedwTbGSS9nz/IAm9cNXUKKg/eKd2h+xvS8MILeoTC9rCfBABx++eCScx384qXVVGNbGi6+mh7Pragrz152taOihR8i5L9m36y+DrncAmUyGs7Mz/v7+tG3blu7duzN06FDatm3baGqi6mJJqcui4a3M1pJSQ/fu3Tl/Kxn7zqOwad4VCxcfbQ0vmE8WRWS7a89XX33FM888Q58+fejVqxcpKSmsWrUKCwvDJklzQKVS4ejoSH5+vt52mUzGqlWrePzxxxtoZgKBGpN+jBHNAmoqOppUp1EJoHszV1Y+3JmT0Zk8t+F8lcFkkJste3Zs59q1a0yZMoVr166hVKoDeQcHB9q1a0dMTAzXrl3jwoULrFu3DlDXetrb2+Pj40OrVq3o0qULAwcOpE+fPv/oD0d9W1J62FuZ/NJtVfTv359z5z4la8+3ZPEtEgtr5C4+tG7bnnW//GwWWRTdbDdwz4y3ZvzorQyGfnLALLPdus1v6Qpr5NZ27Nq1q9ryaaaOg4ODQUApkUgICQlpoBkJBHcx6QylhvrKPL00PJT5g5rmjbt4yxWto0n3Zq6snd2DrMIyo41Kr226hJ+zDX/9qx8WMinv/nWN/GKF3vGuJ+dyPTkPUGdWZvQI0upQlpSU8Nprr/HJJ58AMH78eDZt2qR9bX5+Pvv27ePw4cOcO3eOqKgoUlNTKSzUt/CztrbG09OT5s2bExYWRt++fRk6dKiBaPu92Lp1K9HR0TzzzDNGNSJ1M9n3sqQE6NfSnTEdfAkLcCbE056knCL6Ltuvd8ymmMmuT7Zu3crYsWP1tllZWXH06NFKO3hNCZHtrj5VlQOAiiBXO1EOACxevJglS5YYbF+3bh3Tpk1rgBkJBPqYRUAJollAt0kJ7t2o1DPYlfVze1V6vBV7brBib6T238aalHbt2sXMmTN5+eWXee655+45R4VCwalTp9i3bx+nT58mIiKCxMREcnNz9ZbRLSwscHFxISgoiPbt29OrVy+GDx9eaZd89+7dOXXqFH379mXt2rUEBATojWtqbT0drNjxbH/yisv45USs1pJyStcAdl9NZs7PZwD4cHJHxnT05XJCDr7ONihVKoOAsrHW2v5THDlyhL59++pt27BhQ6P0uK9v1p+KrddVkQ8mdmjS3z2VIcoBqs/FixcrVcmIjo6utUKIQFCfmE1ACeILrKGalFQqlVbGqLZERkaye/duTpw4wZUrV4iNjSUrKwuF4m7mVCqV4ujoiJ+fH23atKFbt24MGjSIIUOGkJeXh0wmw87OjlWrVjF58mT1cXUC7WcGtuDlEa0Z9skBPcvJj6Z0YlK4Px2X7CS3WIGngxWZBaUolCpWPd6VUC8Hg4BSQ2NTA/gnSE9PJzw8nLi4OO22wMDARutxX59ost3vjm/P5C4Ble7XY+keUnJLkEslzB8UwqRwf7wcrUjJLeHX03F8deCm9j41xWy3aH6rGQqFgq+++or//e9/HDhwAECroPHbb79pv88EgobEtIuYKhDgasvPs3rcXWK5kUpshpGOSxNtFmgoR5O6BpMALVu2pGXLljzzzDN629PT09m7dy+HDx/mwoUL3L59m6ioKK5cucLvv/+ut295eTm5ublMmTKF4cOHs3btWn45kVwjS0qA1Dz98cowN0tKUGsITpw4kcTERL3tycnJlJSUYGVl1UAz+2d4fdMlFEoVa0/GcjhKX7RcIoF3x7cnPquIlFz1NbTioTBGt/fh1zNxXIrPoXOgM4uGh+LrbMPrm9RZToVSxeubLplMtrsu5QDldwLQVzdeIj2/xOTLATTI5XIWLlzIU089haWlJa6ursybN49jx44ZrLgIBA2FWQWUGlp6ObB4bDsW086oA4qpNguYYpOSu7s7Dz30EA899JDe9uLiYg4dOsRPP/3EmjVrDF63a9cu3N3dCf7Xjyht1VIcdbGkNIa5WVIWlCjYc+IiJ6JSkLoFospORlmqln0pLS3Vlh2YKpEpeWrBaeBsbDZnY7P1xrsGuWBrKWfz+QQAOvo7MaajL5/ujeSTPeoA65eTsWQWlDG7bzA/HYvmenIe5UoVh6LSiUrNa/IPuKL5rWZU/H3KiL4OwPbt2+nZs2cDz04g0Mc0I6caYGcl13N3MXXMxdHE2tqaYcOGERUVpQ0oZTIZ5eXleHl5ERoaSofwbmyzdtW+praWlFVh6paUxhoqfB5XC+yjUlGek0JB1Enyz/3FpUuXTDqg/OVEbJWlNOPC/FAqVWw5r87edmumvva2XtTP5m69mMjc/s0Z09GX68kRgGlku+MyC3l7yxU+nNyxWuUAEgk80i2Q6T0CCXKzo7C0nCuJOXy2L4qzsWqP739vuULvFu4mVQ5wL83S9q/9jz9T7HBLyTPrJiVB48M0f+UEVWJOvrBZWeofnvbt2zN58mQmTJhAhw4dkEgkXEnMYZuO4DvUzpKyKipaUqpUKs6fP89vv/3Gtm3beOeddwy6oZsC1apHlkiQOXvj0m0sjl3HckDqzJjMQpP68ddlf0RqpfeSXCrhgQ4+nInNIj5bnbW1kqn1V4srZL41mfAOfo7abZVlu69cucKKFSsIDQ1l0aJF9XYu94OalgO8PqoNc/o1Z+O5eH4+HoOjjQWPdA9kw9yeTP76KBfic0yqHKA695QKyFNZ8cvJOH46HmtSNf6Cpo8IKM2Uir6w1W1Samq+sIsWLeKJJ57Ax8fHYKy0guD9gx19WDqhg54l5c4ryUgl8OrI1my5kGhgSVkdcvMLOXMmit9++41169YRGxurzZZWrDVsCtRYX/HO8KnYnCarr6hSqdixYwedO3fG29vbYDy/REFsZqGRV6rp38oDVztLPt6doN12844GbNcgV+Kz7m7vfidz6eVorXcMTbbb1lLG3r17WbZsGbt37wagb9++DRpQ7tq1i5YtWxIcHGx0vKblADKphEd7BLH9UhIv/HrXbnH7pSQOvzyY8WF+XIjPMZlyAKFZKjAFREBpxphDk5KlpaXRYBLAUq7v0PNozyCuJObo+ZsD7LmWwpSuAbTzcdSzpKwuA/r1MbCkLC9XZ6F8fX1rfLyGxFwbKmJiYhg9ejRSqZQhQ4Ywc+ZMxo8frxXcjskooKoQYFwnX0oVSrZdStJu+zsilfisQt4Y3ZqisnIuJ+QQFqBuyikrV2Jtoa+ZqgJmLnyJo9t/JTExUc9hys7Orj5Pt0YoFApGjRqFVCpl4cKFvPnmm7i6uurtU9NyALlUgo2lzKBBLiO/lHKlSi+r29TLAcz1nhKYHiKgFJhtk1IzNzskoA0E3O2tyC0yzEDK7yxNav5bU6aOHsSGNXF6Ekcaxo0bh0wmw8nJCV9fX0JCQujUqRO9evWiX79+jcohxJwbKjQeykqlkn379rF7926sra3p2bMnPXv2xMo3FPAw+lpbSxnD2npxMDJNL8NdolDyxOpTfPFION882kW9raycpTuuM39gCIUlhtfLlm1/UpqUqJ2Lhp07dyKRSJBIJEilUmQyGTKZDAsLCywtLbG0tMTa2hpra2tsbGywtbXF1tYWe3t7HBwccHBwwMnJCScnJ5ydnXFxccHFxQV3d3ftH0tLS6PnV1hYiFKpRKlU8umnn7Jq1Srefvtt5s+fr+3qr2k5QIlCybnYLCaH+3M2NotTtzNxtLFg4eCW5BSVsfZkrPb1VTW/XblyBVdX10ofKhsac76nBKaHaUYKglpjTk1KtbWkrAlBbrasWbqKT5a9z+zZs9myZYt2TCaT8cgjjxAREUFcXByRkZFcvnyZzZs3a/exsLDA2dkZX19fWrZsSVhYGH369KF3796V/sDfDzQNFUC13IQAwgNdeG1Ua9r7OpFfUsa2S0ks3xlBYak6u9SYGyqys7M5c+YMFy5c4Pr169y6dUur+6fJLhcXF/P333/z999/Y+XdAu+Znxo91vC23thayvnjfILBWGRqPsNXHKSlpz1ONhZEpuZTXFbOWw+05cRtw2z4888uZM3K90lIuHssiUSidZPKz8+nsLBQ+6ekpITi4mJKSkrIz8+nrKyM8vJyysvLUSqV1FSG2FjAqus+pVQqyc3N5cUXX+SNN95g9OjRjHpwPLGZrpUe01g5AMBzv57n84fD+fShztptMRkFTP76KHFZRXr76ja/lZSU8Ntvv/HZZ59x6tQpHn/8cVavXl2j8/wnqEmTkoVUyuFXBle6j8bhrDHfUwLTRwSUArNmUKin1pLy24O3GNjKg1/n9jJqSanRn2zt7cDQNl4ANHO1w8HaggV3LDmvJeWy93oqoF6KG9TKEwAPDw82b97Mjz/+yPz58yksLKRFixb89NNPevNRKBScOXOGw4cPc+bMGW7cuEF8fLzWA11XW9PS0hIXFxf8/f1p1aoVnTt3pm/fvnTr1g25vGa39pNPPklISAgvv/yy0ddqGip8nKz5Y35f8orL+OlYjNZN6IVhoXTwc9K6CbX1cWTt7B5EpebzzvareDtZM7dfc4Ld7Ji5+pT6XO/RUJGQkICFhQWenp41Opd7UVZWxqVLlzh79ixXr14lMjKS+Ph4UlJSyMnJoaioyCDQqkxL1d/fn08++YThox+k03/2GF32Hh/mS36Jgt3XUiqdk66Q/sBQD2RSCUfu1Bxq5wC89dxTvLvoaVavXs1rr71GRkYGKpWKESNG8MUXX1T7M9CltLSU9PR0MjMzSU9PJysri8zMTLKzs8nJySEnJ4fc3Fzy8/PJz8+noKCAwsJCioqKKC4upqCgwOhxi4uL2bhxIztOXMZjxseVvr+xcgBQS+bcSMnjbGwWR6PS8XCw4qkBLfh2RlemfHOULJ1srwo4djmKff/7ia+//pqsrCykUilSqbRBtE+VSiUJCQlVakTWpEnJxkLGcxvOGxxjQCsPJnT241BkGmB6mqWCpoUIKAVmzfQegaw+Fg3AyehMJn19lOeGtmJGjyCtJeWyndf55uAt7Wva+zqxaHio3nE0//79TJw2oCxXqni0593lJ4lEwsyZMxkwYACzZs0y6mktl8vp0aMHPXoY/iCUlpZy/PhxrQd6ZGQkiYmJXLx4kTNnzrBu3TrtvlZWVri6uhIQEEDr1q0JDw+nX79+hIWF6dXeARQUFPDDDz8AsHnzZtatW0eLFi2047oNFRM6++FkY8Hkr49qg6B1p+KQSiVMCvfH0VpObrGCl0aEklNUxrTvjpN/Z+k2PquIDyZ1pF9Ldw5FplfaUKFQKPj444956623GD16tJ4P/L1QKpXExMRw5swZLl68SGRkJNHR0SQnJ5OZmUlhYaHR0gNLS0scHBzw9/fHz8+P4OBgWrduTadOnejatSuurq488MAD/Pnnn8jlciQSCf/5z3948cUXtQG4brZbg6udJX1C3NlyIVEve1sZVnIpLw4LJSW3mC0X9Bu2At1steUns2bNYtq0aXz88ccsXbqUwMDaL3NaWlri6+tb63peXVtAuVyOQqGgf//+vPTSS4wePZrz8TlM/Oqo0ddWVg4gk0pYM6sHx29lsnjrFe32w1Hp7HpuAPP6t+D9Hdf1jvXAg+MoTbq7fKwpCfjzzz8ZP3487u7ueHl54efnh5+fH0FBQTRv3hxHR0fqm61btzJ+/HgmT57Mxx9/bBBY1rRJqaisXPt3XSZ38Se3uEzvO8cUmpQETRMRUArMmpZeDvQLcddaUl6Iz+GJOxm0yvj9bDy/n42vch+NJaWxL/Xg4GD27dtX47laWlrSv39/+vfvbzBWWFjI4cOHOXr0KBcuXCAqKorExETOnj3LyZMn9TKhNjY2uLm5ERgYSJs2bfDy8tKOnT17lvbt2/PZZ58xe/ZsJBKJXkNFddyE7K3k9A1xZ9Xh29pgEmDjuXjeGtOWBzr4cCgyXfs56TZUXLx4kccee4yLFy+iUqm4fl0/aMjOzub06dNcuHCBa9eucfv2bRISEkhPTycvL4/S0lKDz0Zjueni4kLbtm0JCgqiVatWtG/fnq5du9KsWTODINsYGr/krl27snr1akJD9R8qdLPdGsZ09MFCJjW63A3w+cOdSc0rITIlD3trC6Z28SfQ1ZYnfjxFQal+44km263Bzs6Ot956q9Ks8j9FSYn6WpDJZEyZMoVFixbpPSxZySv/bCsrB+jezJXW3o68s/2a3vbojEJupuXTJcjF4FjODvakJhlsJiEhgfj4qu9XqVSKpaUlVlZW2tpSJycnXF1dcXNzw8vLC29vb/z8/AgMDKRZs2b4+fnpLffrEhMTg0QiYdOmTWzbto0333yTF198EWtrded+TZuUjOHhYEWv5m5sPBtPiY5iRVNvUhI0XURAKTB7GsqSsj6xtbVl+PDhDB8+3GAsNzeXgwcPcuzYMS5cuMDNmzdJTk7mxIkTHD2qnznS1NfNnTuX//znP6xcuZK91+21n0113IS6BLlgIZNyKSFH79hl5SquJubq1ehqGipeL23JkiVLWLp0qbZWEeDGjRv4+vpWuRRtY2ODk5MTbdq0ISAggJCQENq2bUt4eDgdOnSot1rTF154gf79+zN16lSjAahutlvD+DA/0vJKOFxh+VrDpYQcpnQJ4JHugRSXlXMqOpNnN5znaoV63YrZbl0a2s6yc+fOfP/99wwfPtzoEm/F5jddKisH8HBQn5NMalhqIL+jhauLBLh54Tj7d+9gwYIFxMXFaa+Vb7/9ltmzZ5Ofn090dDSxsbHExcWRkJBAamoqqampZGRkkJ2dTW5uLgUFBSQlJREdHY1CoaiyzlQikSCXy7G0tMTGxgY7OzscHR3JyVFf+5r76c033+TTTz/l7bffZs6cOTVuUjLG2I6+yKQSg8yluTl0CRoPIqAUmD2maEmpi6OjI2PGjGHMmDEGY+np6Tz77LOsW7fO4IczLi6OCVMfJuD5X7U1hNVxE/K8Ewyk5unLL2m2aXQWNcSkF2Dn5IqiWF2LpzsPpVJJSUkJAQEB2qXoNm3a0KlTJ7p06YKLi2Gm6n4REhJCSEhIpeMVs91ApUu9Gr45eEuvnMIYVWW7GwNyuZxZs2ZVOl6x+U1DVeUAt9LU5RQPdvThwI007fZ2vo4097BnnU6XN6jLAeytLXjwwQcZNmwYH330Ee+88w7FxcXaa8Te3p727dvTvn37Gp2fUqkkMTGR6OhoYmJiSEhIIDk5mZSUFDIyMsjMzCQnJ4e8vDxycnJISUmhpKTE4H5KS0tjwYIFLHzhJQKf/1VdKGmEypqUKjIuzJeU3GKO3jJs3jJ1hy5B40RcbQIB5mNJWRF3d3esrKxQqVTa+jd3d3emTp3KsGHDUDh4s2iP/g/WvdyENPqJFYXjQS0HU1FfEYmEsH7DuHn6AFlZWXoZSoBDhw7Rtm3b+j/5+4ApZLvvBzUtB7icmMvByDQmdwnA3sqCQ5FpeDpa8XivZhSXlfPfI3d1XSuWA1hbW/PGG2/w2GOP8cMPPzBs2LA6zV0qleLv74+/v3+1rUNnzJjB2rVrUSqVWhMDFxcXunXrRt8x01iVaDyYhMqblHQJdrejo78z3x++hbEEakWHLoHgn0AElALBHczJklIXa2trPD09mTp1KlOnTqV3797a2rBzsVmw526WrTpuQhrR6YrC8aCup6toNQjw7ff/pXOgC9evX2fNmjX88MMPWhehuLi4JhNQmnq2u7bUphxgzk+nmdu/OQ929GVAKw/KypWcjM7k4903uKUj61VZOUBAQAD//ve/6/U8qktGRgZKpRKJRMKIESNYsGABI0aMQCqVci42i1U1bFKqyPgwdQPV5nOVZzGNPdAJBPcTEVAKBDqYiyWlLl9++SVffPGFUWmc2rgJaeSVPB30rQM121LySgy2a96ndevWvPPOO/zf//0fhw4dYs+ePXTt2rXW59YQmGu2uypqUw5QolCycl8UK/dFVbpPYy0HmDFjBmFhYcyZM8fAjtLYg5aGqjRLdRnbyY+bqflcTqxcG7eq9xEI7gcioBQIKmAOlpQVqUxnsTZuQjficygrV9LBz4ntOst2FjIJbX0d2X5RfylPcud9dJFKpQwYMIABAwbU+pwaEnPNdleFOZUDPPzwwzz88MNGx2rTpKRLWIAzwe52fLQ7otJ9jN1TAsH9RgSUAkElmKslpS61cRPKK1FwJCqdCZ39WLkvUit/M6GzP/ZWcv68rB9Q6uormhLmmO2uClEOoKY2TUq6jOukXu7+owpJIVO9pwSNG3HFCQTVwJwsKStSGzeh5bsi2PhUbzbM7cW6k7F4O1kzp19zDt5I0+vaNaavaEqYY7a7KkQ5gJraaJYCSCXq/c7GZhFbISDVYOr3lKDxIlHV1MxVIBCYFZEpeQxbcVD7707+Tjw3tBXtfBy1bkL/OxvPNwdv6f1Adg1y4dWRrWnv50R+iYLtl5JYtuO6nmA3wJ7n+5t0EFURc81267L+VKxZlwNUvKcANj7dmwAXW3os3UNlH0n/lu789GQP3t5yhR8rNDnpYm73lKBxIAJKgUBwT2asOqHXUFEfaBoqhO+weRKXWVjjcoB+Ie4mUw4g7imBqSECSoFAcE/iMgsZ+skBPYu3umIll7Ln+QEmERwIao+5lgOIe0pgaoiAUiAQVIv1p2LrtaHig4kdmvSypaD+MbdyAHFPCUwJEVAKBIJq8/n+yHprqJg/qHIbQ4HAXBD3lMBUEAGlQCCoEebeUCEQ1DfinhKYAiKgFAgENcbcGyoEgvpG3FOCpo4IKAUCQa0x14YKgeB+Ie4pQVNFBJQCgaBeMLeGCoHgfiPuKUFTQgSUAoFAIBAIBII6IW3oCQgEAoFAIBAImjYioBQIBAKBQCAQ1AkRUAoEAoFAIBAI6oQIKAUCgUAgEAgEdUIElAKBQCAQCASCOiECSoFAIBAIBAJBnRABpUAgEAgEAoGgToiAUiAQCAQCgUBQJ0RAKRAIBAKBQCCoEyKgFAgEAoFAIBDUCRFQCgQCgUAgEAjqhAgoBQKBQCAQCAR1QgSUAoFAIBAIBII6IQJKgUAgEAgEAkGdEAGlQCAQCAQCgaBOiIBSIBAIBAKBQFAnREApEAgEAoFAIKgTIqAUCAQCgUAgENQJEVAKBAKBQCAQCOqECCgFAoFAIBAIBHVCBJQCgUAgEAgEgjohAkqBQCAQCAQCQZ0QAaVAIBAIBAKBoE6IgFIgEAgEAoFAUCdEQCkQCAQCgUAgqBMioBQIBAKBQCAQ1AkRUAoEAoFAIBAI6oQIKAUCgUAgEAgEdUIElAKBQCAQCASCOiECSoFAIBAIBAJBnRABpUAgEAgEAoGgToiAUiAQCAQCgUBQJ0RAKRAIBAKBQCCoEyKgFAgEAoFAIBDUCRFQCgQCgUAgEAjqhAgoBQKBQCAQCAR1QgSUAoFAIBAIBII68f+W96gOKUmHHwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import networkx as nx\n", - "# access and visualize the device topology\n", - "print(rigetti.properties.paradigm.connectivity.connectivityGraph)\n", - "nx.draw_kamada_kawai(rigetti.topology_graph, with_labels=True, font_color=\"white\")" - ] - }, - { - "cell_type": "markdown", - "id": "9fa09f83a0747394", - "metadata": {}, - "source": [ - "Now we can submit a quantum task of the above program with verbatim box." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "b5e7c89c1c9f8879", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:56.299544Z", - "start_time": "2023-11-21T08:32:56.297194Z" - }, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[2]\n", - "PRAGMA PRESERVE_BLOCK\n", - "RX(3.141592653589793) 0\n", - "RX(3.141592653589793) 0\n", - "ISWAP 0 1\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 0 ro[0]\n", - "MEASURE 1 ro[1]\n" - ] - } - ], - "source": [ - "verbatim_task = rigetti.run(OpenQASMProgram(source=program_with_verbatim_box), shots = 10)\n", - "verbatim_result = verbatim_task.result()\n", - "meta = verbatim_result.additional_metadata.rigettiMetadata\n", - "print(meta.compiledProgram)" - ] - }, - { - "cell_type": "markdown", - "id": "bcd27bc239db889d", - "metadata": {}, - "source": [ - "As shown above, the two consecutive `rx` $\\pi$-rotation gates did not get optimized and we confirm that our program was indeed executed verbatim." - ] - }, - { - "cell_type": "markdown", - "id": "b4768a96f7b1b3b6", - "metadata": {}, - "source": [ - "## Requesting Result Types with OpenQASM\n", - "\n", - "Braket provides [a rich library of result types](https://docs.aws.amazon.com/braket/latest/developerguide/braket-result-types.html) for circuit executions. With OpenQASM, requesting different result types for our quantum tasks is easier than ever using the `result` pragma. Next, we give an example of requesting result types for our Bell state program submitted to SV1. Before doing that, let's see what result types are supported on SV1:" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "b17d21060cda7fa7", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:56.304110Z", - "start_time": "2023-11-21T08:32:56.300283Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name='Sample' observables=['x', 'y', 'z', 'h', 'i', 'hermitian'] minShots=1 maxShots=100000\n", - "name='Expectation' observables=['x', 'y', 'z', 'h', 'i', 'hermitian'] minShots=0 maxShots=100000\n", - "name='Variance' observables=['x', 'y', 'z', 'h', 'i', 'hermitian'] minShots=0 maxShots=100000\n", - "name='Probability' observables=None minShots=1 maxShots=100000\n", - "name='Amplitude' observables=None minShots=0 maxShots=0\n", - "name='AdjointGradient' observables=['x', 'y', 'z', 'h', 'i'] minShots=0 maxShots=0\n" - ] - } - ], - "source": [ - "# print the result types supported by SV1\n", - "for iter in sv1.properties.action['braket.ir.openqasm.program'].supportedResultTypes:\n", - " print(iter)" - ] - }, - { - "cell_type": "markdown", - "id": "bbc02495939691c9", - "metadata": {}, - "source": [ - "With knowing the supported result types on SV1, we choose to request the `Expectation` of $X \\otimes Z$ observable on `q[0]` and `q[1]` and the `Amplitude` result type for a `shots=0` quantum task of our bell program:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "6e3b521b7356b4bd", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:56.305634Z", - "start_time": "2023-11-21T08:32:56.302835Z" - } - }, - "outputs": [], - "source": [ - "bell_with_result_type = \"\"\"\n", - "OPENQASM 3;\n", - "\n", - "qubit[2] q;\n", - "\n", - "#pragma braket result expectation x(q[0]) @ z(q[1])\n", - "#pragma braket result amplitude \"00\", \"11\"\n", - "h q[0];\n", - "cnot q[0], q[1];\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "6435b34ab2525039", - "metadata": {}, - "source": [ - "The location of the `result` pragma is very flexible as long as it's after the qubit register definition (if you use physical qubits, you can put `result` pragmas anywhere after the program header).\n", - "\n", - "We can submit the above program and receive the results for our requested result types." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "a42b0ebc71b59136", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:59.113501Z", - "start_time": "2023-11-21T08:32:56.306452Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[0.0, {'00': (0.7071067811865475+0j), '11': (0.7071067811865475+0j)}]\n" - ] - } - ], - "source": [ - "bell_result_types_task = sv1.run(OpenQASMProgram(source=bell_with_result_type), shots = 0)\n", - "bell_result = bell_result_types_task.result()\n", - "values = bell_result.values\n", - "print(values)" - ] - }, - { - "cell_type": "markdown", - "id": "38675f5678613895", - "metadata": {}, - "source": [ - "At last, we want to remind our Braket OpenQASM users that there are two requirements when requesting result types:\n", - "1. For `shots=0` quantum tasks, requesting non-simultaneously measurable result types is allowed, but for `shots>0` quantum tasks, it is not allowed. For example, we can write the following OpenQASM program in a `shots=0` quantum task but not in a `shots>0` quantum task, since the two result types are not simultaneously measurable:" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "45277f89209faec7", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:59.115339Z", - "start_time": "2023-11-21T08:32:59.112696Z" - } - }, - "outputs": [], - "source": [ - "program_with_non_simultaneously_measurable_result_types = \"\"\"\n", - "OPENQASM 3;\n", - "\n", - "qubit[2] q;\n", - "\n", - "h q[0];\n", - "cnot q[0], q[1];\n", - "\n", - "#pragma braket result expectation x(q[0]) @ z(q[1])\n", - "#pragma braket result expectation hermitian([[0, -1im], [1im, 0]]) q[0]\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "id": "a9af8819fba31a90", - "metadata": {}, - "source": [ - "2. Do not use measurement instructions and request result types in the same OpenQASM program, otherwise a validation error will be raised. Since measurement instructions are basically equivalent to `#pragma braket result sample z(qubit)`, we encourage users to adapt a consistent style of requesting result types in the same program." - ] - }, - { - "cell_type": "markdown", - "id": "db79ad324a5f6478", - "metadata": { - "collapsed": false - }, - "source": [ - "Circuits constructed with `from_ir` will have the correct result types:" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "f3c438da3a351153", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:59.127212Z", - "start_time": "2023-11-21T08:32:59.124909Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bell_with_result_type:\n", - "T : │ 0 │ 1 │ Result Types │\n", - " ┌───┐ ┌──────────────────┐ \n", - "q0 : ─┤ H ├───●───┤ Expectation(X@Z) ├─\n", - " └───┘ │ └────────┬─────────┘ \n", - " ┌─┴─┐ ┌────────┴─────────┐ \n", - "q1 : ───────┤ X ├─┤ Expectation(X@Z) ├─\n", - " └───┘ └──────────────────┘ \n", - "T : │ 0 │ 1 │ Result Types │\n", - "\n", - "Additional result types: Amplitude(00,11)\n" - ] - } - ], - "source": [ - "print(\"bell_with_result_type:\")\n", - "print(Circuit.from_ir(bell_with_result_type))" - ] - }, - { - "cell_type": "markdown", - "id": "c371de3097c0598a", - "metadata": { - "collapsed": false - }, - "source": [ - "## Advanced OpenQASM features\n", - "\n", - "OpenQASM has features beyond what is natively supported by the `Circuit` class. You can run OpenQASM tasks directly on the Local Simulator or use Circuit.from_ir to convert an OpenQASM program to a Circuit object, which is supported by all circuit-based Braket devices. The following OpenQASM program is a GHZ state written with classical control flow and subroutines:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "5acb72003cd0a0f5", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:04:08.355878Z", - "start_time": "2023-12-04T04:04:08.353679Z" - }, - "collapsed": false - }, - "outputs": [], - "source": [ - "ghz_with_advanced_features = \"\"\"\n", - "OPENQASM 3.0;\n", - "\n", - "def ghz(int[32] n) {\n", - " h q[0];\n", - " for int i in [0:n - 1] {\n", - " cnot q[i], q[i + 1];\n", - " }\n", - "}\n", - "\n", - "int[32] n = 5;\n", - "bit[n + 1] c;\n", - "qubit[n + 1] q;\n", - "\n", - "ghz(n);\n", - "\n", - "c = measure q;\n", - "\"\"\"\n", - "qasm_program = OpenQASMProgram(source=ghz_with_advanced_features)" - ] - }, - { - "cell_type": "markdown", - "id": "f5d32bd10c64543", - "metadata": { - "collapsed": false - }, - "source": [ - "The local simulator supports these features:" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "c82bee530da348f6", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:04:13.932270Z", - "start_time": "2023-12-04T04:04:13.863203Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "This program uses OpenQASM language features that may not be supported on QPUs or on-demand simulators.\n" - ] - }, - { - "data": { - "text/plain": [ - "Counter({'000000': 505, '111111': 495})" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from braket.devices import LocalSimulator\n", - "LocalSimulator().run(qasm_program, shots=1000).result().measurement_counts" - ] - }, - { - "cell_type": "markdown", - "id": "96fca192b4f51797", - "metadata": { - "collapsed": false - }, - "source": [ - "but SV1 does not. However, `from_ir` will \"unroll\" the subroutine and loop to create a `Circuit` object that _can_ run on SV1:" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "b0886dfc74978bfa", - "metadata": { - "ExecuteTime": { - "end_time": "2023-12-04T04:04:19.974386Z", - "start_time": "2023-12-04T04:04:16.705969Z" - }, - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "This program uses OpenQASM language features that may not be supported on QPUs or on-demand simulators.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │\n", - " ┌───┐ ┌───┐ \n", - "q0 : ─┤ H ├───●───────────────────────────┤ M ├─\n", - " └───┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q1 : ───────┤ X ├───●─────────────────────┤ M ├─\n", - " └───┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q2 : ─────────────┤ X ├───●───────────────┤ M ├─\n", - " └───┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q3 : ───────────────────┤ X ├───●─────────┤ M ├─\n", - " └───┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q4 : ─────────────────────────┤ X ├───●───┤ M ├─\n", - " └───┘ │ └───┘ \n", - " ┌─┴─┐ ┌───┐ \n", - "q5 : ───────────────────────────────┤ X ├─┤ M ├─\n", - " └───┘ └───┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │\n", - "Counter({'000000': 500, '111111': 500})\n" - ] - } - ], - "source": [ - "circuit = Circuit.from_ir(qasm_program)\n", - "print(circuit)\n", - "print(sv1.run(circuit, shots=1000).result().measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "id": "a329fa3df47ffee4", - "metadata": { - "collapsed": false - }, - "source": [ - "For an in-depth exploration of advanced OpenQASM features, see [Simulating Advanced OpenQASM Programs with the Local Simulator](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb)." - ] - }, - { - "cell_type": "markdown", - "id": "9e4c7a48a2b83ce1", - "metadata": {}, - "source": [ - "# Conclusion\n", - "\n", - "In this notebook, you learned how to submit OpenQASM quantum tasks and use OpenQASM features on Braket. Hope you enjoyed it! You can find more information about OpenQASM3.0 in its [live specification](https://openqasm.com/), and you can learn more about OpenQASM support on Braket in the [Amazon Braket documentation](https://docs.aws.amazon.com/braket/latest/developerguide/)." - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "id": "3f5bc3dfad520f14", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T08:32:59.624204Z", - "start_time": "2023-11-21T08:32:59.127772Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Quantum Task Summary\n", - "{<_Amazon.SV1: 'arn:aws:braket:::device/quantum-simulator/amazon/sv1'>: {'shots': 1120, 'tasks': {'CREATED': 1, 'COMPLETED': 4}, 'execution_duration': datetime.timedelta(microseconds=104000), 'billed_execution_duration': datetime.timedelta(seconds=12)}, <_Amazon.DM1: 'arn:aws:braket:::device/quantum-simulator/amazon/dm1'>: {'shots': 30, 'tasks': {'COMPLETED': 3}, 'execution_duration': datetime.timedelta(microseconds=39000), 'billed_execution_duration': datetime.timedelta(seconds=9)}, <_Rigetti.Ankaa2: 'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2'>: {'shots': 20, 'tasks': {'COMPLETED': 2}}}\n", - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run this example: 0.64 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.9.6" - } + "cells": [ + { + "cell_type": "markdown", + "id": "80787a2d092c6fe2", + "metadata": {}, + "source": [ + "# Getting Started with OpenQASM on Braket" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f30932accbfc8959", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:03:29.377972Z", + "start_time": "2023-12-04T04:03:29.350550Z" + } + }, + "outputs": [], + "source": [ + "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", + "from braket.tracking import Tracker\n", + "\n", + "t = Tracker().start()" + ] + }, + { + "cell_type": "markdown", + "id": "a2b23cf2abc23663", + "metadata": {}, + "source": [ + "OpenQASM is a popular human-readable and hardware-agnostic quantum circuit description language. It is open-source and has been actively maintained by a [Technical Steering Committee](https://medium.com/qiskit/introducing-a-technical-steering-committee-for-openqasm3-f9db808108e1) formed by IBM, Amazon, Microsoft and the University of Innsbruck. Amazon Braket now supports OpenQASM 3.0 as an *Intermediate Representation* (IR) in addition to the in-house *JSON-Based AWS Quantum Circuit Description* ([JAQCD](https://github.com/amazon-braket/amazon-braket-schemas-python/tree/main/src/braket/ir/jaqcd)). In this notebook, we demonstrate how to submit OpenQASM quantum tasks to various devices on Braket and introduce some OpenQASM features available on Braket." + ] + }, + { + "cell_type": "markdown", + "id": "ee898521529c0469", + "metadata": {}, + "source": [ + "## Create and submit an OpenQASM quantum task\n", + "\n", + "Submitting a quantum task with OpenQASM is just as simple as using JAQCD. You can use the Amazon Braket Python SDK, Boto3, or the AWS CLI to submit OpenQASM 3.0 quantum tasks to an Amazon Braket device. We will go over each method in this section.\n", + "\n", + "\n", + "### A Bell state\n", + "\n", + "We will start with by preparing a [Bell state](https://en.wikipedia.org/wiki/Bell_state) in OpenQASM:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ca2bc5f0a29e6dd6", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:03:31.815079Z", + "start_time": "2023-12-04T04:03:31.796365Z" + } + }, + "outputs": [], + "source": [ + "bell_qasm = \"\"\"\n", + "OPENQASM 3;\n", + "\n", + "qubit[2] q;\n", + "bit[2] c;\n", + "\n", + "h q[0];\n", + "cnot q[0], q[1];\n", + "\n", + "c = measure q;\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "d9b588c2b02979f6", + "metadata": {}, + "source": [ + "Compare this to the same Bell state written in JAQCD:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a378dc21e3ede3d0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:03:32.662932Z", + "start_time": "2023-12-04T04:03:32.608503Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"braketSchemaHeader\": {\n", + " \"name\": \"braket.ir.jaqcd.program\",\n", + " \"version\": \"1\"\n", + " },\n", + " \"instructions\": [\n", + " {\n", + " \"target\": 0,\n", + " \"type\": \"h\"\n", + " },\n", + " {\n", + " \"control\": 0,\n", + " \"target\": 1,\n", + " \"type\": \"cnot\"\n", + " }\n", + " ],\n", + " \"results\": null,\n", + " \"basis_rotation_instructions\": null\n", + "}\n" + ] + } + ], + "source": [ + "from braket.ir.jaqcd import CNot, H, Program\n", + "\n", + "program = Program(instructions=[H(target=0), CNot(control=0, target=1)])\n", + "print(program.json(indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "b8f68befdae02c0", + "metadata": {}, + "source": [ + "Immediately, we can see a difference: In OpenQASM, users define their own qubit registers, and thus the syntax is closer to what quantum algorithm researchers are used to; on the other hand, in JAQCD, qubits are indexed by integers and the convention is closer to that of hardware providers. Also, JAQCD has result types and basis rotation instructions embedded in the language while OpenQASM doesn't support them inherently (but later we will show how to use the `pragma` syntax to support them in OpenQASM)." + ] + }, + { + "cell_type": "markdown", + "id": "a92df8c76a81db2c", + "metadata": {}, + "source": [ + "\n", + "### Use the Python SDK to create OpenQASM 3.0 quantum tasks\n", + "\n", + "Most Braket users might want to use the Braket Python SDK to submit OpenQASM quantum tasks. To submit our Bell state program in the Python SDK, we first choose the quantum device that we want to run our program on. In this example, we will use the SV1 state-vector simulator for demonstration." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8b433a601a62b11d", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:03:38.321971Z", + "start_time": "2023-12-04T04:03:36.978785Z" + } + }, + "outputs": [], + "source": [ + "from braket.aws import AwsDevice\n", + "from braket.devices import Devices\n", + "\n", + "sv1 = AwsDevice(Devices.Amazon.SV1)" + ] + }, + { + "cell_type": "markdown", + "id": "d46340ec242cfc8b", + "metadata": {}, + "source": [ + "To submit the OpenQASM quantum task, we initialize an `OpenQASMProgram` object using the Bell state program text string `bell_qasm` we defined above and send it to the SV1 simulator." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1e81325c5357195d", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:03:41.134199Z", + "start_time": "2023-12-04T04:03:39.866510Z" }, - "nbformat": 4, - "nbformat_minor": 5 + "scrolled": false + }, + "outputs": [], + "source": [ + "from braket.ir.openqasm import Program as OpenQASMProgram\n", + "\n", + "bell_program = OpenQASMProgram(source=bell_qasm)\n", + "bell_task = sv1.run(\n", + " bell_program,\n", + " shots=100,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ba9729ce6ab2bf91", + "metadata": {}, + "source": [ + "### Submit OpenQASM 3.0 programs using the AWS Command Line Interface\n", + "\n", + "Alternatively, if you like the command line experience or you are not a Python user, you can also choose to use the [AWS Command Line Interface (CLI)](https://aws.amazon.com/cli/) to submit our Bell state program. Before doing that we have to make sure we have [AWS CLI installed](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). The following code saves the `bell_qasm` string to a file named `bell.qasm`:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "61362f489016dd1f", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.407834Z", + "start_time": "2023-11-21T08:32:41.403524Z" + } + }, + "outputs": [], + "source": [ + "with open(\"bell.qasm\", \"w\") as f:\n", + " f.write(bell_qasm)" + ] + }, + { + "cell_type": "markdown", + "id": "5c4be932b51fd2ac", + "metadata": {}, + "source": [ + "Then we can use the command below to submit the quantum task via AWS CLI. Remember to replace the placeholder \\\"amazon-braket-my-bucket\\\" with your own bucket name.\n", + " \n", + " aws braket create-quantum-task \\\n", + " --region \"us-west-1\" \\\n", + " --device-arn \"arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2\" \\\n", + " --shots 100 \\\n", + " --action '{\n", + " \"braketSchemaHeader\": {\n", + " \"name\": \"braket.ir.openqasm.program\", \n", + " \"version\": \"1\"\n", + " },\n", + " \"source\": $(cat bell.qasm)\n", + " }'" + ] + }, + { + "cell_type": "markdown", + "id": "68222e9240c91d58", + "metadata": { + "collapsed": false + }, + "source": [ + "## Convert OpenQASM 3.0 programs to circuits\n", + "\n", + "You can convert OpenQASM programs into Braket `Circuit` objects if you want to programmatically change your program." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "96417df481e2f5d", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.420933Z", + "start_time": "2023-11-21T08:32:41.407658Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │\n", + " ┌───┐ ┌───┐ \n", + "q0 : ─┤ H ├───●───┤ M ├─\n", + " └───┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q1 : ───────┤ X ├─┤ M ├─\n", + " └───┘ └───┘ \n", + "T : │ 0 │ 1 │ 2 │\n" + ] + } + ], + "source": [ + "from braket.circuits import Circuit\n", + "\n", + "print(Circuit.from_ir(bell_qasm))" + ] + }, + { + "cell_type": "markdown", + "id": "4fec44c2bb4680df", + "metadata": {}, + "source": [ + "## Figure out what OpenQASM features are supported on each device\n", + "\n", + "Different devices on Braket support different subsets of OpenQASM features. To see what are the supported OpenQASM features on each device, we can simply check the device capability for OpenQASM actions. As an example, we can take a look at the `action` field in the device capability of SV1 simulator:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "78a5c9f03581cea4", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.425542Z", + "start_time": "2023-11-21T08:32:41.422663Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['ccnot',\n", + " 'cnot',\n", + " 'cphaseshift',\n", + " 'cphaseshift00',\n", + " 'cphaseshift01',\n", + " 'cphaseshift10',\n", + " 'cswap',\n", + " 'cy',\n", + " 'cz',\n", + " 'ecr',\n", + " 'h',\n", + " 'i',\n", + " 'iswap',\n", + " 'pswap',\n", + " 'phaseshift',\n", + " 'rx',\n", + " 'ry',\n", + " 'rz',\n", + " 's',\n", + " 'si',\n", + " 'swap',\n", + " 't',\n", + " 'ti',\n", + " 'v',\n", + " 'vi',\n", + " 'x',\n", + " 'xx',\n", + " 'xy',\n", + " 'y',\n", + " 'yy',\n", + " 'z',\n", + " 'zz',\n", + " 'gpi',\n", + " 'gpi2',\n", + " 'ms']" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# supportedOperations\n", + "sv1.properties.action[\"braket.ir.openqasm.program\"].supportedOperations" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "85fbc40dc254813e", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.463833Z", + "start_time": "2023-11-21T08:32:41.425725Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['braket_unitary_matrix',\n", + " 'braket_basis_rotation',\n", + " 'braket_result_type_sample',\n", + " 'braket_result_type_expectation',\n", + " 'braket_result_type_variance',\n", + " 'braket_result_type_probability',\n", + " 'braket_result_type_amplitude',\n", + " 'braket_result_type_adjoint_gradient']" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# supportedPragmas\n", + "sv1.properties.action[\"braket.ir.openqasm.program\"].supportedPragmas" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1fa721d9960f5412", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.464559Z", + "start_time": "2023-11-21T08:32:41.429030Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['braket_result_type_state_vector',\n", + " 'braket_result_type_density_matrix',\n", + " 'braket_noise_amplitude_damping',\n", + " 'braket_noise_bit_flip',\n", + " 'braket_noise_depolarizing',\n", + " 'braket_noise_kraus',\n", + " 'braket_noise_pauli_channel',\n", + " 'braket_noise_generalized_amplitude_damping',\n", + " 'braket_noise_phase_flip',\n", + " 'braket_noise_phase_damping',\n", + " 'braket_noise_two_qubit_dephasing',\n", + " 'braket_noise_two_qubit_depolarizing']" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# forbiddenPragmas\n", + "sv1.properties.action[\"braket.ir.openqasm.program\"].forbiddenPragmas" + ] + }, + { + "cell_type": "markdown", + "id": "8190bb8089c7db3f", + "metadata": {}, + "source": [ + "The SV1 OpenQASM `action` field lists supported/forbidden OpenQASM features on the device, including `supportedPragmas`, `forbiddenPragmas`, `maximumQubitArrays`, `maximumClassicalArrays`, `requiresAllQubitsMeasurement`, `supportedResultTypes`, etc. The names are self-evident, but readers are encouraged to visit the [Amazon Braket developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-using.html) for full information of what these fields mean." + ] + }, + { + "cell_type": "markdown", + "id": "ee537a4601e4c244", + "metadata": {}, + "source": [ + "# OpenQASM features on Braket\n", + "\n", + "Braket supports many useful OpenQASM features, either through the OpenQASM program syntax or Braket-specific pragmas. We will walk through some of these features in this section.\n", + "\n", + "## Simulating Noise with OpenQASM\n", + "\n", + "With the fully on-demand, high-performance, density-matrix simulator [DM1](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-dm1), you can easily investigate the effects of realistic noise on your quantum programs. Now, we show how to use OpenQASM programs to leverage the circuit-level noise simulation capability of DM1.\n", + "\n", + "To simulate noise, we have to be able to specify different noise channels. Although syntax for noise channels is not available in the OpenQASM language, Braket uses the `pragma` statement to extend OpenQASM for defining noise channels. Here is an example of an OpenQASM program that prepares a noisy 3-qubit [GHZ state](https://en.wikipedia.org/wiki/Greenberger%E2%80%93Horne%E2%80%93Zeilinger_state):" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4d8a62cfc51a18b", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.464621Z", + "start_time": "2023-11-21T08:32:41.431447Z" + } + }, + "outputs": [], + "source": [ + "noisy_ghz3_program = \"\"\"\n", + "// noisy_ghz3.qasm\n", + "// Prepare a 3 noisy qubit GHZ state\n", + "OPENQASM 3;\n", + "\n", + "qubit[3] q;\n", + "bit[3] c;\n", + "\n", + "h q[0];\n", + "#pragma braket noise depolarizing(0.1) q[0]\n", + "cnot q[0], q[1];\n", + "#pragma braket noise depolarizing(0.1) q[0]\n", + "#pragma braket noise depolarizing(0.1) q[1]\n", + "cnot q[1], q[2];\n", + "#pragma braket noise depolarizing(0.1) q[0]\n", + "#pragma braket noise depolarizing(0.1) q[1]\n", + "\n", + "c = measure q;\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "3a988726bb4c39e8", + "metadata": {}, + "source": [ + "In the example above, we inserted the depolarizing noise channel with probability of 0.1 after each gate in the circuit. The `noisy_ghz3_program` is equivalent to the following program in the Braket SDK:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "647e3717ccbba672", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:41.464801Z", + "start_time": "2023-11-21T08:32:41.434396Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Circuit('instructions': [Instruction('operator': H('qubit_count': 1), 'target': QubitSet([Qubit(0)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(0)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': CNot('qubit_count': 2), 'target': QubitSet([Qubit(0), Qubit(1)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(0)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(1)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': CNot('qubit_count': 2), 'target': QubitSet([Qubit(1), Qubit(2)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(1)]), 'control': QubitSet([]), 'control_state': (), 'power': 1), Instruction('operator': Depolarizing(0.1), 'target': QubitSet([Qubit(2)]), 'control': QubitSet([]), 'control_state': (), 'power': 1)])" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from braket.circuits import Circuit, noises\n", + "\n", + "noisy_ghz3_circ = Circuit().h(0).cnot(0, 1).cnot(1, 2)\n", + "noise = noises.Depolarizing(probability=0.1)\n", + "noisy_ghz3_circ.apply_gate_noise(noise)" + ] + }, + { + "cell_type": "markdown", + "id": "1db047fbac6a26bb", + "metadata": {}, + "source": [ + "To see if `noisy_ghz3_program` and `noisy_ghz3_circ` are indeed the same, we can run both circuits and compare the results:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4c57de26c172aa5", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:42.963722Z", + "start_time": "2023-11-21T08:32:41.441098Z" + } + }, + "outputs": [], + "source": [ + "dm1 = AwsDevice(Devices.Amazon.DM1)\n", + "\n", + "noisy_ghz3_circ_task = dm1.run(noisy_ghz3_circ, shots=10)\n", + "noisy_ghz3_program_task = dm1.run(OpenQASMProgram(source=noisy_ghz3_program), shots=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "75984e0e95dc4afb", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:45.959888Z", + "start_time": "2023-11-21T08:32:42.975561Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sdk measurement results: Counter({'111': 4, '000': 3, '101': 2, '100': 1})\n", + "openqasm measurement results: Counter({'111': 3, '000': 3, '100': 2, '011': 1, '010': 1})\n" + ] + } + ], + "source": [ + "sdk_result = noisy_ghz3_circ_task.result()\n", + "openqasm_result = noisy_ghz3_program_task.result()\n", + "sdk_measurement = sdk_result.measurement_counts\n", + "openqasm_measurement = openqasm_result.measurement_counts\n", + "print(\"sdk measurement results:\", sdk_measurement)\n", + "print(\"openqasm measurement results:\", openqasm_measurement)" + ] + }, + { + "cell_type": "markdown", + "id": "f2720672ca96b104", + "metadata": {}, + "source": [ + "As expected, the measurement counts of the two are very close.\n", + "\n", + "In addition to depolarizing noises, we can simulate more complicated noise types with Braket, e.g., `pauli_channel`, `amplitude_damping`, etc. Check the [Amazon Braket developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-using.html) for a complete list of noise channels supported on Braket. Here we give another example of general noise channels defined by the Kraus representation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f3231a7767d20640", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:45.971122Z", + "start_time": "2023-11-21T08:32:45.960859Z" + } + }, + "outputs": [], + "source": [ + "noisy_program_with_kraus_operators = \"\"\"\n", + "// noisy_program_with_kraus_operators\n", + "OPENQASM 3;\n", + "\n", + "qubit[2] q;\n", + "bit[2] c;\n", + "\n", + "h q[0];\n", + "#pragma braket noise kraus([[0.9486833, 0], [0, 0.9486833]], [[0, 0.31622777], [0.31622777, 0]]) q[0]\n", + "cnot q[0], q[1];\n", + "\n", + "c = measure q;\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "ebac8bbb6d45341d", + "metadata": {}, + "source": [ + "We inserted a single qubit noise channel defined by two 2x2 complex Kraus operators in the example above on qubit `q[0]`. Braket will validate if the Kraus operators indeed form a Completely-Positive and Trace-Preserving (CPTP) map." + ] + }, + { + "cell_type": "markdown", + "id": "ffa5e09c2ceab140", + "metadata": { + "collapsed": false + }, + "source": [ + "The `from_ir` method supports noise operations, including general Kraus operators." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "69c7ae1c396ac705", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:46.004276Z", + "start_time": "2023-11-21T08:32:45.977541Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "noisy_ghz3_program:\n", + "T : │ 0 │ 1 │ 2 │ 3 │\n", + " ┌───┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───┐ \n", + "q0 : ─┤ H ├─┤ DEPO(0.1) ├───●───┤ DEPO(0.1) ├─┤ DEPO(0.1) ├─────────────────────┤ M ├─\n", + " └───┘ └───────────┘ │ └───────────┘ └───────────┘ └───┘ \n", + " ┌─┴─┐ ┌───────────┐ ┌───────────┐ ┌───┐ \n", + "q1 : ─────────────────────┤ X ├─┤ DEPO(0.1) ├─────────────────●───┤ DEPO(0.1) ├─┤ M ├─\n", + " └───┘ └───────────┘ │ └───────────┘ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q2 : ───────────────────────────────────────────────────────┤ X ├───────────────┤ M ├─\n", + " └───┘ └───┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │\n", + "\n", + "noisy_program_with_kraus_operators:\n", + "T : │ 0 │ 1 │ 2 │\n", + " ┌───┐ ┌────┐ ┌───┐ \n", + "q0 : ─┤ H ├─┤ KR ├───●───┤ M ├─\n", + " └───┘ └────┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q1 : ──────────────┤ X ├─┤ M ├─\n", + " └───┘ └───┘ \n", + "T : │ 0 │ 1 │ 2 │\n", + "\n", + "Kraus operators:\n" + ] + }, + { + "data": { + "text/plain": [ + "[array([[0.9486833+0.j, 0. +0.j],\n", + " [0. +0.j, 0.9486833+0.j]]),\n", + " array([[0. +0.j, 0.31622777+0.j],\n", + " [0.31622777+0.j, 0. +0.j]])]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(\"noisy_ghz3_program:\")\n", + "print(Circuit.from_ir(noisy_ghz3_program))\n", + "print()\n", + "print(\"noisy_program_with_kraus_operators:\")\n", + "circuit_kraus = Circuit.from_ir(noisy_program_with_kraus_operators)\n", + "print(circuit_kraus)\n", + "print()\n", + "print(\"Kraus operators:\")\n", + "circuit_kraus.instructions[1].operator.to_matrix()" + ] + }, + { + "cell_type": "markdown", + "id": "a6b1ce4e1900550", + "metadata": {}, + "source": [ + "## Submitting parametrized quantum tasks with OpenQASM\n", + "\n", + "The on-demand [SV1 simulator](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-sv1) and [DM1 simulator](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-dm1) support submitting OpenQASM programs with free parameters. You can set the value of the parameter when you submit the quantum task, like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "71245a134d32fa26", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:46.007177Z", + "start_time": "2023-11-21T08:32:46.003030Z" + } + }, + "outputs": [], + "source": [ + "parameter_qasm = \"\"\"\n", + "OPENQASM 3.0;\n", + "input float alpha;\n", + "\n", + "bit[2] b;\n", + "qubit[2] q;\n", + "\n", + "h q[0];\n", + "h q[1];\n", + "rx(alpha) q[0];\n", + "rx(alpha) q[1];\n", + "b[0] = measure q[0];\n", + "b[1] = measure q[1];\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "bec130ddc2409db5", + "metadata": {}, + "source": [ + "The `input float alpha` line indicates that we have an input parameter of type `float` named `alpha`. We can specify a value for `alpha` when we submit the quantum task using the optional `inputs` argument to `run`. `input` should be a `dict` of `string`-`float` pairs." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "b831353ac6cfab2a", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:48.743543Z", + "start_time": "2023-11-21T08:32:46.007096Z" + }, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'11': 4, '01': 3, '00': 2, '10': 1})\n" + ] + } + ], + "source": [ + "input_dict = {\"alpha\": 0.1}\n", + "param_sv1_task = sv1.run(OpenQASMProgram(source=parameter_qasm), shots=10, inputs=input_dict)\n", + "param_sv1_result = param_sv1_task.result()\n", + "print(param_sv1_result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "id": "eb90a29d1debc7b4", + "metadata": {}, + "source": [ + "Similarly, we can specify values for parametrized noise operations:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "94f2688b3380c621", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:48.746739Z", + "start_time": "2023-11-21T08:32:48.743876Z" + } + }, + "outputs": [], + "source": [ + "parameter_noise_qasm = \"\"\"\n", + "OPENQASM 3.0;\n", + "input float beta;\n", + "input float alpha;\n", + "bit[2] b;\n", + "qubit[2] q;\n", + "h q[0];\n", + "h q[1];\n", + "rx(alpha) q[0];\n", + "rx(alpha) q[1];\n", + "#pragma braket noise bit_flip(beta) q[0]\n", + "b[0] = measure q[0];\n", + "b[1] = measure q[1];\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "101d366dca84ddb2", + "metadata": {}, + "source": [ + "We can see there are now two `input` lines, one for each free parameter." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "a0aa8a773b16dc22", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:51.579287Z", + "start_time": "2023-11-21T08:32:48.747668Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'01': 3, '11': 3, '10': 3, '00': 1})\n" + ] + } + ], + "source": [ + "noise_input_dict = {\"alpha\": 0.1, \"beta\": 0.2}\n", + "param_dm1_task = dm1.run(OpenQASMProgram(source=parameter_qasm), shots=10, inputs=noise_input_dict)\n", + "param_dm1_result = param_dm1_task.result()\n", + "print(param_dm1_result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "id": "7e60112ddc974a94", + "metadata": {}, + "source": [ + "## Simulating arbitrary unitaries with OpenQASM\n", + "\n", + "The on-demand [SV1 simulator](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html#braket-simulator-sv1) allows us to simulate arbitrary unitary gates in a circuit. With OpenQASM, we can use the `unitary` pramga to insert these arbitrary unitary gates: " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "ffc32efec9315f0", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:51.589214Z", + "start_time": "2023-11-21T08:32:51.579008Z" + } + }, + "outputs": [], + "source": [ + "program_with_unitary = \"\"\"\n", + "// noisy_program_with_kraus_operators\n", + "OPENQASM 3;\n", + "\n", + "qubit q;\n", + "bit c;\n", + "\n", + "#pragma braket unitary([[0, -1im], [1im, 0]]) q\n", + "c = measure q;\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "8c190474a6e28563", + "metadata": {}, + "source": [ + "The `1im` in the `unitary` pragma is the OpenQASM notation of the imaginary number $i$, thus, we were simply using the pragma to perform a Pauli Y gate. We can check it by submitting the above program to SV1." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "6d687471d81b2367", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:54.390589Z", + "start_time": "2023-11-21T08:32:51.586164Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'1': 10})\n" + ] + } + ], + "source": [ + "unitary_task = sv1.run(OpenQASMProgram(source=program_with_unitary), shots=10)\n", + "unitary_result = unitary_task.result()\n", + "print(unitary_result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "id": "76f2897ec744dafb", + "metadata": {}, + "source": [ + "As expected, the Pauli Y gate flipped the initial 0 state to the 1 state." + ] + }, + { + "cell_type": "markdown", + "id": "111ead44155005a8", + "metadata": { + "collapsed": false + }, + "source": [ + "`from_ir` will reconstruct the unitary:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "7b631be4b6785b90", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:54.403015Z", + "start_time": "2023-11-21T08:32:54.398210Z" + }, + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0.+0.j, 0.-1.j],\n", + " [0.+1.j, 0.+0.j]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Circuit.from_ir(program_with_unitary).instructions[0].operator.to_matrix()" + ] + }, + { + "cell_type": "markdown", + "id": "ce9caf39", + "metadata": {}, + "source": [ + "## Measuring specific qubits with OpenQASM\n", + "\n", + "The Local State Vector Simulator and Local Density Matrix Simulator support submitting OpenQASM programs where a subset of the circuit's qubits can be measured, which is often called partial measurement. For example, you can create a two-qubit circuit and only measure the first qubit like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "d33a0cb6", + "metadata": {}, + "outputs": [], + "source": [ + "partial_measure_qasm = \"\"\"\n", + "OPENQASM 3.0;\n", + "bit[1] b;\n", + "qubit[2] q;\n", + "h q[0];\n", + "cnot q[0], q[1];\n", + "b[0] = measure q[0];\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "81247da3", + "metadata": {}, + "source": [ + "We can see that there are two qubits, `q[0]` and `q[1]` but we are only measuring qubit 0 here: `b[0] = measure q[0]`.\n", + "\n", + "Now we can run this on the local state vector simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d747fcb4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'1': 7, '0': 3})\n", + "Measured qubits: [0]\n" + ] + } + ], + "source": [ + "from braket.devices import LocalSimulator\n", + "\n", + "local_sim = LocalSimulator()\n", + "partial_measure_local_sim_task = local_sim.run(\n", + " OpenQASMProgram(source=partial_measure_qasm), shots=10\n", + ")\n", + "partial_measure_local_sim_result = partial_measure_local_sim_task.result()\n", + "print(partial_measure_local_sim_result.measurement_counts)\n", + "print(\"Measured qubits: \", partial_measure_local_sim_result.measured_qubits)" + ] + }, + { + "cell_type": "markdown", + "id": "923c3cd7", + "metadata": {}, + "source": [ + "As expected, only the targeted qubits were measured. \n", + "\n", + "The OpenQASM program `partial_measure_qasm` is equivalent to the following `Circuit`:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "5b4e6ae6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'0': 5, '1': 5})\n", + "Measured qubits: [0]\n" + ] + } + ], + "source": [ + "partial_measure = Circuit().h(0).cnot(0, 1).measure(0)\n", + "partial_measure_task = local_sim.run(partial_measure, shots=10)\n", + "partial_measure_result = partial_measure_task.result()\n", + "print(partial_measure_result.measurement_counts)\n", + "print(\"Measured qubits: \", partial_measure_result.measured_qubits)" + ] + }, + { + "cell_type": "markdown", + "id": "49b97636", + "metadata": {}, + "source": [ + "We can check whether a device supports partial measurement by inspecting the `requiresAllQubitsMeasurement` field in its action properties; if it is `False`, then partial measurement is supported." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "74a715eb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "AwsDevice(Devices.Rigetti.Ankaa2).properties.action[\n", + " \"braket.ir.openqasm.program\"\n", + "].requiresAllQubitsMeasurement" + ] + }, + { + "cell_type": "markdown", + "id": "a6a94ac1", + "metadata": {}, + "source": [ + "Here, `requiresAllQubitsMeasurement` is `False`, which indicates that not all qubits must be measured." + ] + }, + { + "cell_type": "markdown", + "id": "8996e0c59741a66f", + "metadata": {}, + "source": [ + "## Qubit Rewiring with OpenQASM\n", + "\n", + "Amazon Braket supports the [physical qubit notation within OpenQASM](https://openqasm.com/language/types.html#physical-qubits) on Rigetti devices. When using physical qubits, you have to ensure that the qubits are indeed connected on the selected device. Alternatively, if qubit registers are used instead, the `PARTIAL` rewiring strategy is enabled by default on Rigetti devices. The following example shows how to use physical qubit notation in an OpenQASM program:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "144cc3e458a21b2d", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:54.410178Z", + "start_time": "2023-11-21T08:32:54.402877Z" + } + }, + "outputs": [], + "source": [ + "ghz_program_with_physical_qubits = \"\"\"\n", + "// Prepare a GHZ state\n", + "OPENQASM 3;\n", + "\n", + "bit[3] ro;\n", + "h $0;\n", + "cnot $0, $1;\n", + "cnot $1, $2;\n", + "ro[0] = measure $0;\n", + "ro[1] = measure $1;\n", + "ro[2] = measure $2;\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "3f01e6dc44e0e226", + "metadata": {}, + "source": [ + "We can run the above program on the Rigetti Ankaa-2 device," + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "768b980b78c4d451", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:55.489511Z", + "start_time": "2023-11-21T08:32:54.414005Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Measured qubits: [0, 1, 2]\n" + ] + } + ], + "source": [ + "# choose the quantum device\n", + "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "\n", + "ghz_program_with_physical_qubits_task = rigetti.run(\n", + " OpenQASMProgram(source=ghz_program_with_physical_qubits), shots=10\n", + ")\n", + "measured_qubits = ghz_program_with_physical_qubits_task.result().measured_qubits\n", + "print(\"Measured qubits:\", measured_qubits)" + ] + }, + { + "cell_type": "markdown", + "id": "5a5597dc7843d541", + "metadata": {}, + "source": [ + "As we can see, physical qubits 0, 1 and 2 are indeed being used and measured." + ] + }, + { + "cell_type": "markdown", + "id": "25cb2ccc4337dc1e", + "metadata": {}, + "source": [ + "
\n", + " Note: This section and the next verbatim box section uses the Rigetti Ankaa-2 device. When you run this notebook, make sure the device is currently available. You can find QPU availability windows on the Devices page in the Amazon Braket Console\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "9c30ec68828b17ff", + "metadata": {}, + "source": [ + "## Verbatim Compilation with OpenQASM\n", + "\n", + "In [a previous example notebook](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Verbatim_Compilation.ipynb), we talked about verbatim compilation on Braket to gain more precise control on Rigetti devices. With OpenQASM3.0, we can use the `box` syntax together with the `verbatim` pragma to perform verbatim compilation. Here is an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "a69ab8a7a04aa190", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:55.492060Z", + "start_time": "2023-11-21T08:32:55.489240Z" + } + }, + "outputs": [], + "source": [ + "program_with_verbatim_box = \"\"\"\n", + "OPENQASM 3;\n", + "\n", + "bit[2] ro;\n", + "#pragma braket verbatim\n", + "box{\n", + " rx(3.141592653589793) $0;\n", + " rx(3.141592653589793) $0;\n", + " iswap $0, $1;\n", + "}\n", + "ro[0] = measure $0;\n", + "ro[1] = measure $1;\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "d503dc700f00f7b7", + "metadata": {}, + "source": [ + "To program with verbatim boxes, we need to make sure that\n", + "- we are using native gates supported by Rigetti devices. Native gates can be found using the following script:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a1cb1cb78d32b7b1", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:55.496864Z", + "start_time": "2023-11-21T08:32:55.493060Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The native gates for the Ankaa-2 device are:\n", + "rx\n", + "rz\n", + "cz\n", + "iswap\n" + ] + } + ], + "source": [ + "print(\"The native gates for the\", rigetti.name, \"device are:\")\n", + "for gate in rigetti.properties.paradigm.nativeGateSet:\n", + " print(gate)" + ] + }, + { + "cell_type": "markdown", + "id": "1d24104e29717209", + "metadata": {}, + "source": [ + "- we use the physical qubit notation.\n", + "- qubit operands are indeed connected on the physical device. Recall that the device qubit connectivity can be found using the following commands:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "f6a7ffff1914fd03", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:56.296409Z", + "start_time": "2023-11-21T08:32:55.495523Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import networkx as nx\n", + "\n", + "# access and visualize the device topology\n", + "print(rigetti.properties.paradigm.connectivity.connectivityGraph)\n", + "nx.draw_kamada_kawai(rigetti.topology_graph, with_labels=True, font_color=\"white\")" + ] + }, + { + "cell_type": "markdown", + "id": "9fa09f83a0747394", + "metadata": {}, + "source": [ + "Now we can submit a quantum task of the above program with verbatim box." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b5e7c89c1c9f8879", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:56.299544Z", + "start_time": "2023-11-21T08:32:56.297194Z" + }, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[2]\n", + "PRAGMA PRESERVE_BLOCK\n", + "RX(3.141592653589793) 0\n", + "RX(3.141592653589793) 0\n", + "ISWAP 0 1\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 0 ro[0]\n", + "MEASURE 1 ro[1]\n" + ] + } + ], + "source": [ + "verbatim_task = rigetti.run(OpenQASMProgram(source=program_with_verbatim_box), shots=10)\n", + "verbatim_result = verbatim_task.result()\n", + "meta = verbatim_result.additional_metadata.rigettiMetadata\n", + "print(meta.compiledProgram)" + ] + }, + { + "cell_type": "markdown", + "id": "bcd27bc239db889d", + "metadata": {}, + "source": [ + "As shown above, the two consecutive `rx` $\\pi$-rotation gates did not get optimized and we confirm that our program was indeed executed verbatim." + ] + }, + { + "cell_type": "markdown", + "id": "b4768a96f7b1b3b6", + "metadata": {}, + "source": [ + "## Requesting Result Types with OpenQASM\n", + "\n", + "Braket provides [a rich library of result types](https://docs.aws.amazon.com/braket/latest/developerguide/braket-result-types.html) for circuit executions. With OpenQASM, requesting different result types for our quantum tasks is easier than ever using the `result` pragma. Next, we give an example of requesting result types for our Bell state program submitted to SV1. Before doing that, let's see what result types are supported on SV1:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "b17d21060cda7fa7", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:56.304110Z", + "start_time": "2023-11-21T08:32:56.300283Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name='Sample' observables=['x', 'y', 'z', 'h', 'i', 'hermitian'] minShots=1 maxShots=100000\n", + "name='Expectation' observables=['x', 'y', 'z', 'h', 'i', 'hermitian'] minShots=0 maxShots=100000\n", + "name='Variance' observables=['x', 'y', 'z', 'h', 'i', 'hermitian'] minShots=0 maxShots=100000\n", + "name='Probability' observables=None minShots=1 maxShots=100000\n", + "name='Amplitude' observables=None minShots=0 maxShots=0\n", + "name='AdjointGradient' observables=['x', 'y', 'z', 'h', 'i'] minShots=0 maxShots=0\n" + ] + } + ], + "source": [ + "# print the result types supported by SV1\n", + "for iter in sv1.properties.action[\"braket.ir.openqasm.program\"].supportedResultTypes:\n", + " print(iter)" + ] + }, + { + "cell_type": "markdown", + "id": "bbc02495939691c9", + "metadata": {}, + "source": [ + "With knowing the supported result types on SV1, we choose to request the `Expectation` of $X \\otimes Z$ observable on `q[0]` and `q[1]` and the `Amplitude` result type for a `shots=0` quantum task of our bell program:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "6e3b521b7356b4bd", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:56.305634Z", + "start_time": "2023-11-21T08:32:56.302835Z" + } + }, + "outputs": [], + "source": [ + "bell_with_result_type = \"\"\"\n", + "OPENQASM 3;\n", + "\n", + "qubit[2] q;\n", + "\n", + "#pragma braket result expectation x(q[0]) @ z(q[1])\n", + "#pragma braket result amplitude \"00\", \"11\"\n", + "h q[0];\n", + "cnot q[0], q[1];\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "6435b34ab2525039", + "metadata": {}, + "source": [ + "The location of the `result` pragma is very flexible as long as it's after the qubit register definition (if you use physical qubits, you can put `result` pragmas anywhere after the program header).\n", + "\n", + "We can submit the above program and receive the results for our requested result types." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "a42b0ebc71b59136", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:59.113501Z", + "start_time": "2023-11-21T08:32:56.306452Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.0, {'00': (0.7071067811865475+0j), '11': (0.7071067811865475+0j)}]\n" + ] + } + ], + "source": [ + "bell_result_types_task = sv1.run(OpenQASMProgram(source=bell_with_result_type), shots=0)\n", + "bell_result = bell_result_types_task.result()\n", + "values = bell_result.values\n", + "print(values)" + ] + }, + { + "cell_type": "markdown", + "id": "38675f5678613895", + "metadata": {}, + "source": [ + "At last, we want to remind our Braket OpenQASM users that there are two requirements when requesting result types:\n", + "1. For `shots=0` quantum tasks, requesting non-simultaneously measurable result types is allowed, but for `shots>0` quantum tasks, it is not allowed. For example, we can write the following OpenQASM program in a `shots=0` quantum task but not in a `shots>0` quantum task, since the two result types are not simultaneously measurable:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "45277f89209faec7", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:59.115339Z", + "start_time": "2023-11-21T08:32:59.112696Z" + } + }, + "outputs": [], + "source": [ + "program_with_non_simultaneously_measurable_result_types = \"\"\"\n", + "OPENQASM 3;\n", + "\n", + "qubit[2] q;\n", + "\n", + "h q[0];\n", + "cnot q[0], q[1];\n", + "\n", + "#pragma braket result expectation x(q[0]) @ z(q[1])\n", + "#pragma braket result expectation hermitian([[0, -1im], [1im, 0]]) q[0]\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "a9af8819fba31a90", + "metadata": {}, + "source": [ + "2. Do not use measurement instructions and request result types in the same OpenQASM program, otherwise a validation error will be raised. Since measurement instructions are basically equivalent to `#pragma braket result sample z(qubit)`, we encourage users to adapt a consistent style of requesting result types in the same program." + ] + }, + { + "cell_type": "markdown", + "id": "db79ad324a5f6478", + "metadata": { + "collapsed": false + }, + "source": [ + "Circuits constructed with `from_ir` will have the correct result types:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "f3c438da3a351153", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:59.127212Z", + "start_time": "2023-11-21T08:32:59.124909Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bell_with_result_type:\n", + "T : │ 0 │ 1 │ Result Types │\n", + " ┌───┐ ┌──────────────────┐ \n", + "q0 : ─┤ H ├───●───┤ Expectation(X@Z) ├─\n", + " └───┘ │ └────────┬─────────┘ \n", + " ┌─┴─┐ ┌────────┴─────────┐ \n", + "q1 : ───────┤ X ├─┤ Expectation(X@Z) ├─\n", + " └───┘ └──────────────────┘ \n", + "T : │ 0 │ 1 │ Result Types │\n", + "\n", + "Additional result types: Amplitude(00,11)\n" + ] + } + ], + "source": [ + "print(\"bell_with_result_type:\")\n", + "print(Circuit.from_ir(bell_with_result_type))" + ] + }, + { + "cell_type": "markdown", + "id": "c371de3097c0598a", + "metadata": { + "collapsed": false + }, + "source": [ + "## Advanced OpenQASM features\n", + "\n", + "OpenQASM has features beyond what is natively supported by the `Circuit` class. You can run OpenQASM tasks directly on the Local Simulator or use Circuit.from_ir to convert an OpenQASM program to a Circuit object, which is supported by all circuit-based Braket devices. The following OpenQASM program is a GHZ state written with classical control flow and subroutines:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "5acb72003cd0a0f5", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:04:08.355878Z", + "start_time": "2023-12-04T04:04:08.353679Z" + }, + "collapsed": false + }, + "outputs": [], + "source": [ + "ghz_with_advanced_features = \"\"\"\n", + "OPENQASM 3.0;\n", + "\n", + "def ghz(int[32] n) {\n", + " h q[0];\n", + " for int i in [0:n - 1] {\n", + " cnot q[i], q[i + 1];\n", + " }\n", + "}\n", + "\n", + "int[32] n = 5;\n", + "bit[n + 1] c;\n", + "qubit[n + 1] q;\n", + "\n", + "ghz(n);\n", + "\n", + "c = measure q;\n", + "\"\"\"\n", + "qasm_program = OpenQASMProgram(source=ghz_with_advanced_features)" + ] + }, + { + "cell_type": "markdown", + "id": "f5d32bd10c64543", + "metadata": { + "collapsed": false + }, + "source": [ + "The local simulator supports these features:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "c82bee530da348f6", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:04:13.932270Z", + "start_time": "2023-12-04T04:04:13.863203Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This program uses OpenQASM language features that may not be supported on QPUs or on-demand simulators.\n" + ] + }, + { + "data": { + "text/plain": [ + "Counter({'000000': 505, '111111': 495})" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from braket.devices import LocalSimulator\n", + "\n", + "LocalSimulator().run(qasm_program, shots=1000).result().measurement_counts" + ] + }, + { + "cell_type": "markdown", + "id": "96fca192b4f51797", + "metadata": { + "collapsed": false + }, + "source": [ + "but SV1 does not. However, `from_ir` will \"unroll\" the subroutine and loop to create a `Circuit` object that _can_ run on SV1:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "b0886dfc74978bfa", + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-04T04:04:19.974386Z", + "start_time": "2023-12-04T04:04:16.705969Z" + }, + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "This program uses OpenQASM language features that may not be supported on QPUs or on-demand simulators.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │\n", + " ┌───┐ ┌───┐ \n", + "q0 : ─┤ H ├───●───────────────────────────┤ M ├─\n", + " └───┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q1 : ───────┤ X ├───●─────────────────────┤ M ├─\n", + " └───┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q2 : ─────────────┤ X ├───●───────────────┤ M ├─\n", + " └───┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q3 : ───────────────────┤ X ├───●─────────┤ M ├─\n", + " └───┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q4 : ─────────────────────────┤ X ├───●───┤ M ├─\n", + " └───┘ │ └───┘ \n", + " ┌─┴─┐ ┌───┐ \n", + "q5 : ───────────────────────────────┤ X ├─┤ M ├─\n", + " └───┘ └───┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │\n", + "Counter({'000000': 500, '111111': 500})\n" + ] + } + ], + "source": [ + "circuit = Circuit.from_ir(qasm_program)\n", + "print(circuit)\n", + "print(sv1.run(circuit, shots=1000).result().measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "id": "a329fa3df47ffee4", + "metadata": { + "collapsed": false + }, + "source": [ + "For an in-depth exploration of advanced OpenQASM features, see [Simulating Advanced OpenQASM Programs with the Local Simulator](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb)." + ] + }, + { + "cell_type": "markdown", + "id": "9e4c7a48a2b83ce1", + "metadata": {}, + "source": [ + "# Conclusion\n", + "\n", + "In this notebook, you learned how to submit OpenQASM quantum tasks and use OpenQASM features on Braket. Hope you enjoyed it! You can find more information about OpenQASM3.0 in its [live specification](https://openqasm.com/), and you can learn more about OpenQASM support on Braket in the [Amazon Braket documentation](https://docs.aws.amazon.com/braket/latest/developerguide/)." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "3f5bc3dfad520f14", + "metadata": { + "ExecuteTime": { + "end_time": "2023-11-21T08:32:59.624204Z", + "start_time": "2023-11-21T08:32:59.127772Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum Task Summary\n", + "{<_Amazon.SV1: 'arn:aws:braket:::device/quantum-simulator/amazon/sv1'>: {'shots': 1120, 'tasks': {'CREATED': 1, 'COMPLETED': 4}, 'execution_duration': datetime.timedelta(microseconds=104000), 'billed_execution_duration': datetime.timedelta(seconds=12)}, <_Amazon.DM1: 'arn:aws:braket:::device/quantum-simulator/amazon/dm1'>: {'shots': 30, 'tasks': {'COMPLETED': 3}, 'execution_duration': datetime.timedelta(microseconds=39000), 'billed_execution_duration': datetime.timedelta(seconds=9)}, <_Rigetti.Ankaa2: 'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2'>: {'shots': 20, 'tasks': {'COMPLETED': 2}}}\n", + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run this example: 0.64 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(t.quantum_tasks_statistics())\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/braket_features/Getting_notifications_when_a_quantum_task_completes/Getting_notifications_when_a_quantum_task_completes.ipynb b/examples/braket_features/Getting_notifications_when_a_quantum_task_completes/Getting_notifications_when_a_quantum_task_completes.ipynb index 5d7294ea5..64238bc85 100644 --- a/examples/braket_features/Getting_notifications_when_a_quantum_task_completes/Getting_notifications_when_a_quantum_task_completes.ipynb +++ b/examples/braket_features/Getting_notifications_when_a_quantum_task_completes/Getting_notifications_when_a_quantum_task_completes.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -162,6 +163,7 @@ "device = AwsDevice(Devices.Amazon.SV1)\n", "# ##\n", "\n", + "\n", "def ghz_circuit(n_qubits: int) -> Circuit:\n", " \"\"\"\n", " Function to return simple GHZ circuit ansatz. Assumes all qubits in range(0, n_qubits-1)\n", @@ -172,11 +174,11 @@ " :rtype: Circuit\n", " \"\"\"\n", "\n", - " circuit = Circuit() # instantiate circuit object\n", - " circuit.h(0) # add Hadamard gate on first qubit\n", + " circuit = Circuit() # instantiate circuit object\n", + " circuit.h(0) # add Hadamard gate on first qubit\n", "\n", - " for ii in range(0, n_qubits-1):\n", - " circuit.cnot(control=ii, target=ii+1) # apply series of CNOT gates\n", + " for ii in range(0, n_qubits - 1):\n", + " circuit.cnot(control=ii, target=ii + 1) # apply series of CNOT gates\n", " return circuit\n", "\n", "\n", @@ -239,8 +241,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/braket_features/IQM_Garnet_Native_Gates.ipynb b/examples/braket_features/IQM_Garnet_Native_Gates.ipynb index 92307dc64..cf47ff323 100644 --- a/examples/braket_features/IQM_Garnet_Native_Gates.ipynb +++ b/examples/braket_features/IQM_Garnet_Native_Gates.ipynb @@ -35,10 +35,10 @@ "source": [ "import numpy as np\n", "import sympy as sp\n", - "from sympy import I, nsimplify\n", + "from sympy import nsimplify\n", "\n", - "from braket.circuits import Circuit\n", "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit\n", "\n", "pi = np.pi" ] @@ -68,9 +68,16 @@ "metadata": {}, "outputs": [], "source": [ - "rx_symbolic = lambda x: sp.Matrix([[sp.cos(x/2), -1j*sp.sin(x/2)], [-1j*sp.sin(x/2), sp.cos(x/2)]])\n", - "rz_symbolic = lambda x: sp.Matrix([[sp.exp(-1j*x/2), 0], [0, sp.exp(1j*x/2)]])\n", - "prx_symbolic = lambda a1, a2: rz_symbolic(a2) * rx_symbolic(a1) * rz_symbolic(-a2)" + "def rx_symbolic(x):\n", + " return sp.Matrix([[sp.cos(x / 2), -1j * sp.sin(x / 2)], [-1j * sp.sin(x / 2), sp.cos(x / 2)]])\n", + "\n", + "\n", + "def rz_symbolic(x):\n", + " return sp.Matrix([[sp.exp(-1j * x / 2), 0], [0, sp.exp(1j * x / 2)]])\n", + "\n", + "\n", + "def prx_symbolic(a1, a2):\n", + " return rz_symbolic(a2) * rx_symbolic(a1) * rz_symbolic(-a2)" ] }, { @@ -104,7 +111,7 @@ } ], "source": [ - "theta, phi = sp.symbols('theta phi')\n", + "theta, phi = sp.symbols(\"theta phi\")\n", "prx_matrix = prx_symbolic(theta, phi)\n", "\n", "nsimplify(prx_matrix, tolerance=1e-8)" @@ -141,7 +148,7 @@ } ], "source": [ - "theta, phi = sp.symbols('theta phi')\n", + "theta, phi = sp.symbols(\"theta phi\")\n", "rx_matrix = prx_symbolic(theta, 0)\n", "\n", "nsimplify(rx_matrix.evalf(), tolerance=1e-8)" @@ -178,8 +185,8 @@ } ], "source": [ - "theta, phi = sp.symbols('theta phi')\n", - "ry_matrix = prx_symbolic(theta, pi/2)\n", + "theta, phi = sp.symbols(\"theta phi\")\n", + "ry_matrix = prx_symbolic(theta, pi / 2)\n", "\n", "nsimplify(ry_matrix.evalf(), tolerance=1e-8)" ] @@ -240,7 +247,7 @@ "metadata": {}, "outputs": [], "source": [ - "device = AwsDevice('arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet')\n", + "device = AwsDevice(\"arn:aws:braket:eu-north-1::device/qpu/iqm/Garnet\")\n", "\n", "circuit = Circuit().h(0).cnot(0, 1)\n", "\n", @@ -371,7 +378,7 @@ } ], "source": [ - "circuit = Circuit().prx(1, pi/2, 1).cz(1, 2)\n", + "circuit = Circuit().prx(1, pi / 2, 1).cz(1, 2)\n", "circuit = Circuit().add_verbatim_box(circuit)\n", "print(circuit)" ] @@ -458,7 +465,7 @@ } ], "source": [ - "circuit_2 = Circuit().prx(1, 0.5, 1.5-0.5).cz(1, 2).rz(1, 0.5).rz(2, 0.7)\n", + "circuit_2 = Circuit().prx(1, 0.5, 1.5 - 0.5).cz(1, 2).rz(1, 0.5).rz(2, 0.7)\n", "print(circuit_2)" ] }, @@ -489,7 +496,7 @@ ], "source": [ "u1 = circuit_1.to_unitary()\n", - "u2 = circuit_2.to_unitary() \n", + "u2 = circuit_2.to_unitary()\n", "\n", "product = u1 @ np.linalg.inv(u2)\n", "np.isclose(np.abs(sum(np.diag(product))), 4.0)" diff --git a/examples/braket_features/IonQ_Native_Gates.ipynb b/examples/braket_features/IonQ_Native_Gates.ipynb index 93ffef3d1..179cfbce7 100644 --- a/examples/braket_features/IonQ_Native_Gates.ipynb +++ b/examples/braket_features/IonQ_Native_Gates.ipynb @@ -71,7 +71,11 @@ "phi = symbols(\"phi\")\n", "\n", "gpi = Matrix([[0, exp(-I * phi)], [exp(I * phi), 0]])\n", - "GPi = lambda x: gpi.subs({\"phi\": x})\n", + "\n", + "\n", + "def GPi(x):\n", + " return gpi.subs({\"phi\": x})\n", + "\n", "\n", "print(\"The GPi gate is defined as:\")\n", "GPi(phi)" @@ -196,7 +200,11 @@ ], "source": [ "gpi2 = 1 / sqrt(2) * Matrix([[1, -I * exp(-I * phi)], [-I * exp(I * phi), 1]])\n", - "GPi2 = lambda x: gpi2.subs({\"phi\": x})\n", + "\n", + "\n", + "def GPi2(x):\n", + " return gpi2.subs({\"phi\": x})\n", + "\n", "\n", "print(\"The GPi2 gate is defined as:\")\n", "GPi2(phi)" @@ -328,14 +336,18 @@ } ], "source": [ - "from sympy import I, Matrix, cos, exp, expand, pi, simplify, sin, symbols, trigsimp\n", + "from sympy import I, Matrix, cos, exp, pi, simplify, sin, symbols\n", "\n", "alpha, beta, gamma = symbols(\"alpha, beta, gamma\")\n", "\n", - "RX = lambda alpha: Matrix(\n", - " [[cos(alpha / 2), -I * sin(alpha / 2)], [-I * sin(alpha / 2), cos(alpha / 2)]]\n", - ")\n", - "RZ = lambda beta: Matrix([[exp(-I * beta / 2), 0], [0, exp(I * beta / 2)]])\n", + "\n", + "def RX(alpha):\n", + " return Matrix([[cos(alpha / 2), -I * sin(alpha / 2)], [-I * sin(alpha / 2), cos(alpha / 2)]])\n", + "\n", + "\n", + "def RZ(beta):\n", + " return Matrix([[exp(-I * beta / 2), 0], [0, exp(I * beta / 2)]])\n", + "\n", "\n", "zxz = simplify(RZ(alpha) * RX(beta) * RZ(gamma), full=True)\n", "zxz" @@ -366,9 +378,7 @@ "source": [ "# with some help, sympy can simplify this expression\n", "general_rotation = (\n", - " GPi2(alpha - pi / 2)\n", - " * GPi((alpha - beta - gamma + pi) / 2)\n", - " * GPi2(3 * pi / 2 - gamma)\n", + " GPi2(alpha - pi / 2) * GPi((alpha - beta - gamma + pi) / 2) * GPi2(3 * pi / 2 - gamma)\n", ")\n", "general_rotation = simplify(\n", " exp(-I * alpha / 2) * exp(I * gamma / 2) * general_rotation\n", @@ -481,6 +491,7 @@ "outputs": [], "source": [ "import numpy as np\n", + "\n", "from braket.circuits import Circuit, Gate\n", "\n", "\n", @@ -504,9 +515,7 @@ " qubits = list(instruction.target)\n", " for qubit in qubits:\n", " if not (0 <= qubit < max_num_qubits):\n", - " raise ValueError(\n", - " f\"Qubit {qubit} is not in the valid range [0, {max_num_qubits}].\"\n", - " )\n", + " raise ValueError(f\"Qubit {qubit} is not in the valid range [0, {max_num_qubits}].\")\n", "\n", " # gate validation\n", " valid_gate_names = {Gate.GPi, Gate.GPi2, Gate.MS}\n", @@ -771,7 +780,7 @@ } ], "source": [ - "from sympy import I, Matrix, cos, exp, pi, sin, symbols\n", + "from sympy import I, Matrix, exp, pi, symbols\n", "from sympy.interactive.printing import init_printing\n", "from sympy.matrices import Matrix\n", "\n", @@ -1395,7 +1404,7 @@ "source": [ "import math\n", "\n", - "from braket.circuits import Circuit, circuit\n", + "from braket.circuits import Circuit\n", "from braket.devices import LocalSimulator" ] }, @@ -1552,9 +1561,7 @@ "\n", "\n", "def swap_classical_bitstrings(num_qubits):\n", - " qubits_to_swap = [\n", - " [qubits[i], qubits[-i - 1]] for i in range(math.floor(num_qubits / 2))\n", - " ]\n", + " qubits_to_swap = [[qubits[i], qubits[-i - 1]] for i in range(math.floor(num_qubits / 2))]\n", " swapped_bitstring_keys = []\n", " for pair in qubits_to_swap:\n", " for i in range(2**num_qubits):\n", diff --git a/examples/braket_features/Noise_models/Noise_models_on_Rigetti.ipynb b/examples/braket_features/Noise_models/Noise_models_on_Rigetti.ipynb index 5b00a60a7..fb7dba427 100644 --- a/examples/braket_features/Noise_models/Noise_models_on_Rigetti.ipynb +++ b/examples/braket_features/Noise_models/Noise_models_on_Rigetti.ipynb @@ -1,997 +1,992 @@ { - "cells": [ - { - "cell_type": "markdown", - "id": "74154c03-d48f-4f41-867b-5e30254ce31a", - "metadata": {}, - "source": [ - "# Noise models on Rigetti\n", - "\n", - "This notebook shows how to construct a noise model from device calibration data for Rigetti Ankaa-2. We compare the measurement outcomes of circuits run on a noisy simulator with the same circuits run on quantum processing units (QPUs), to show that simulating circuits with noise models more closely mimics QPUs.\n", - "\n", - "**Before you begin**: We recommend being familiar with [Noise models on Amazon Braket.](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Noise_models/Noise_models_on_Amazon_Braket.ipynb)\n", - "Additionally, users should be familiar with [Running quantum circuits on QPU devices](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/getting_started/2_Running_quantum_circuits_on_QPU_devices/2_Running_quantum_circuits_on_QPU_devices.ipynb). \n", - "\n", - "### Table of Contents\n", - "\n", - "- Noise model for Rigetti\n", - " - Loading device calibration data\n", - " - Comparing noisy simulator results to QPU results\n", - " - Smaller noise models compared to QPU results" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "e5e15fcd-55a2-4168-acc6-a38100f94511", - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "from braket.aws import AwsDevice\n", - "from braket.circuits import Circuit, Gate, Observable\n", - "from braket.circuits.noise_model import GateCriteria, NoiseModel, ObservableCriteria\n", - "from braket.circuits.noises import AmplitudeDamping, BitFlip, Depolarizing, PhaseDamping, TwoQubitDepolarizing\n", - "from braket.devices import Devices, LocalSimulator" - ] - }, - { - "cell_type": "markdown", - "id": "d4da3e37-e93c-4273-98bc-d67b26b8c822", - "metadata": {}, - "source": [ - "Braket provides access to hardware providers' reported calibration data. \n", - "This can be used to construct noise models to approximate the behavior of the QPU when running circuits on a noisy simulator.\n", - "In this tutorial, we focus on local noise models with no crosstalk interactions. Real devices can have crosstalk and unexpected effects that can further degrade the results.\n", - "\n", - "The Ankaa-2 calibration data is available on the Braket devices page. Under qubit specs, the calibration data include the qubit index, with corresponding values for the $T_1$, $T_2$, fidelity from randomized benchmarking (fRB), fidelity from simultaneous randomized benchmarking (fsRB), and readout fidelity (fRO).\n", - "Under \"edge specs\", the data includes the RB fidelity for two qubit gates for each connected edge in the device topology." - ] - }, - { - "cell_type": "markdown", - "id": "38001b96-faf7-49f0-b5a5-2d52820fcfc9", - "metadata": {}, - "source": [ - "**One-qubit calibration data (Qubit specs)**\n", - "
\n", - "\n", - "\n", - "**Two-qubit calibration data (Edge specs)**\n", - "
" - ] - }, - { - "cell_type": "markdown", - "id": "276d680f-887d-4929-bcaa-e276a6303496", - "metadata": {}, - "source": [ - "We can programmatically access all the calibration data with the Braket SDK. First we load the AwsDevice using the ARN for Rigetti Ankaa-2." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "a55ea9d5-05f3-4da5-a305-a391e914d012", - "metadata": {}, - "outputs": [], - "source": [ - "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "66d8f3bf", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "a8a42ae1-51ac-4bf1-bd6a-81ffd982b5f8", - "metadata": {}, - "source": [ - "The properties dictionary contains one- and two-qubit calibration data. " - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "153b5b63-8205-4a7e-bb18-0305ef428f36", - "metadata": {}, - "outputs": [], - "source": [ - "one_qubit_data = rigetti.properties.standardized.oneQubitProperties\n", - "two_qubit_data = rigetti.properties.standardized.twoQubitProperties" - ] - }, - { - "cell_type": "markdown", - "id": "661cca17-01fa-40be-bd3e-741bacc74ce4", - "metadata": {}, - "source": [ - "For Ankaa-2, we can get all qubit indices with `one_qubit_data.keys()` or with `rigetti.topology_graph.nodes`.\n", - "\n", - "The keys of the two qubit dictionary are the connected qubit pairs separated by a hyphen. \n", - "For example, if qubit 0 and 1 are connected the key is \"0-1\".\n", - "\n", - "\n", - "#### One-qubit noise \n", - "\n", - "Let's look at the one qubit calibration data for qubit 0." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "8d4ecc35-f4dc-49d8-b6ff-adaee560ac4b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "OneQubitProperties(T1=CoherenceTime(value=8.645474408067754e-06, standardError=None, unit='S'), T2=CoherenceTime(value=1.2710111632672265e-05, standardError=None, unit='S'), oneQubitFidelity=[Fidelity1Q(fidelityType=FidelityType(name='RANDOMIZED_BENCHMARKING', description=None), fidelity=0.998913376867117, standardError=2.7016428586132974e-05), Fidelity1Q(fidelityType=FidelityType(name='SIMULTANEOUS_RANDOMIZED_BENCHMARKING', description=None), fidelity=0.9975435377199546, standardError=0.00015343141167926104), Fidelity1Q(fidelityType=FidelityType(name='READOUT', description=None), fidelity=0.9219999999999999, standardError=None)])" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "one_qubit_data[\"0\"]" - ] - }, - { - "cell_type": "markdown", - "id": "4b676762-e642-4a98-89e3-86d79367071a", - "metadata": {}, - "source": [ - "For each qubit, there are various metrics of the quality:\n", - "\n", - "- **T1**: Thermal relaxation time is related to the time it takes for the excited state, |1⟩, to decay into the ground state, |0⟩. The probability of remaining in the excited state is $p(|1⟩)\\sim e^{-t/T_1}$\n", - "\n", - "- **T2**: The dephasing time, is the decay constant for the scale for a |+⟩ state to decohere into the completely mixed state. $p(|+⟩)\\sim e^{-t/T_2}$ \n", - "\n", - "- **Fidelity (RB)**: Single-qubit randomized benchmarking fidelities. RB fidelity quantifies the average gate fidelity where the average is over all Clifford gates. RB describes an *effective* noise model with gate-independent depolarizing noise on each Clifford gate.\n", - "\n", - "- **Fidelity (sRB)**: Single-qubit simultaneous randomized benchmarking fidelities. These are extracted by running single-qubit RB on all qubits simultaneously. Note that we expect the sRB fidelity to be lower than standard RB fidelity due to non-local crosstalk type noise on the device. \n", - "\n", - "- **Readout fidelity**: Single-qubit readout fidelities describes the probability of a bit flip error before readout in the computational basis. The readout fidelity is related to the probability of correctly measuring the ground state and excited states respectively, e.g. $f_{RO} =\\frac{p(0|0)+p(1|1)}{2}$" - ] - }, - { - "cell_type": "markdown", - "id": "296708a3-771e-42b4-9ba8-f3db1a02970b", - "metadata": {}, - "source": [ - "Now that we know how to extract and use the calibration data, we can build a simple noise model. For every qubit we will add:\n", - "- amplitude dampening noise with probability $p= 1-e^{-t/T_1}$ for every gate\n", - "- phase dampening noise with probability $p= 0.5(1-e^{-t/T_2})$ for every gate\n", - "- depolarizing noise with probability $p=1-f_{sRB}$ (from simultaneous RB fidelity) for every gate\n", - "- readout bit flip noise with probability $p=1-f_{RO}$ to measurements \n", - "\n", - "Technically, the sRB fidelity already includes effects from $T_1$/$T_2$, however to be explicit we add these as separate terms. In a sense, this model might overestimate the noise on the QPU. " - ] - }, - { - "cell_type": "markdown", - "id": "5769f2f4-de1c-4b47-9e4e-fd8d39b9e975", - "metadata": {}, - "source": [ - "To create the noise model, we iterate over all qubits keys in `one_qubit_data`" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "7442cd27", - "metadata": {}, - "outputs": [], - "source": [ - "noise_model = NoiseModel()\n", - "\n", - "# Readout Noise Model\n", - "for q, data in rigetti.properties.standardized.oneQubitProperties.items():\n", - " try:\n", - " readout_error = 1 - data.oneQubitFidelity[2].fidelity # readout\n", - " noise_model.add_noise(BitFlip(readout_error), ObservableCriteria(qubits=int(q)))\n", - " \n", - " depolarizing_rate = 1 - data.oneQubitFidelity[1].fidelity # SIMULTANEOUS_RANDOMIZED_BENCHMARKING\n", - " noise_model.add_noise(Depolarizing(probability=depolarizing_rate), GateCriteria(qubits=q))\n", - " except:\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "9d20d24c-17e2-4bba-b317-fb2d156bedb0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of terms in noise model is: 167\n", - "Number of parameters in noise model is: 167\n" - ] - } - ], - "source": [ - "num_params = sum(len(item.noise.parameters) for item in noise_model.instructions)\n", - "print(f\"Number of terms in noise model is: {len(noise_model.instructions)}\")\n", - "print(f\"Number of parameters in noise model is: {num_params}\")" - ] - }, - { - "cell_type": "markdown", - "id": "790c62f7-776a-4e4c-9405-7b7a14eee5b0", - "metadata": {}, - "source": [ - "#### Two-qubit noise \n", - "Next we consider adding two-qubit noise to the model. \n", - "\n", - "Let's first look at the data provided in the Ankaa-2 device calibration data. On the first connect, \"0-1\", the properties are:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "626cbe56-3649-48eb-a2a1-f669eb790b47", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "TwoQubitProperties(twoQubitGateFidelity=[GateFidelity2Q(direction=None, gateName='ISWAP', fidelity=0.9773180863130815, standardError=0.00408287380553746, fidelityType=FidelityType(name='INTERLEAVED_RANDOMIZED_BENCHMARKING', description=None))])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "two_qubit_data[\"0-1\"]" - ] - }, - { - "cell_type": "markdown", - "id": "4bcd3be4-a6e4-4cf3-841e-1a451e01803a", - "metadata": {}, - "source": [ - "Here, we see the fidelity per gate (ISWAP or CZ) and the associated standard error. \n", - "\n", - "Next we loop over the entries in the `two_qubit_data` dictionary and add two-qubit depolarizing noise to the model. Notice that Ankaa-2 has symmetric connections (\"0-1\" and \"1-0\") so we need to add noise in both directions." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "80f57550-6549-46b6-9a6d-ff7f0f03e90d", - "metadata": {}, - "outputs": [], - "source": [ - "# Two-qubit noise\n", - "for pair, data in two_qubit_data.items(): # iterate over qubit connections\n", - "\n", - " # parse strings \"0-1\" to integers [0, 1]\n", - " q0, q1 = (int(s) for s in pair.split(\"-\"))\n", - " try:\n", - " if data.twoQubitGateFidelity[0].gateName == \"ISWAP\":\n", - " phase_rate = 1 - data.twoQubitGateFidelity[0].fidelity\n", - " noise_model.add_noise(\n", - " TwoQubitDepolarizing(phase_rate),\n", - " GateCriteria(\n", - " Gate.ISwap, [(q0, q1), (q1, q0)]\n", - " ), # symmetric connections\n", - " )\n", - " except:\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "82376d08-84bc-4249-9c8d-d7aacdb73113", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of terms in noise model is: 274\n", - "Number of parameters in noise model is: 274\n" - ] - } - ], - "source": [ - "num_params = sum(len(item.noise.parameters) for item in noise_model.instructions)\n", - "print(f\"Number of terms in noise model is: {len(noise_model.instructions)}\")\n", - "print(f\"Number of parameters in noise model is: {num_params}\")" - ] - }, - { - "cell_type": "markdown", - "id": "5913a8a2-a9de-4e32-a35d-c48191891b1f", - "metadata": {}, - "source": [ - "### Compare circuits run on device vs simulator with a noise model\n", - "\n", - "Let's just look at the first 5 qubits. Note that to ensure the noise model applied T1 and T2 noise during the time between gate, we manually add identity gates to each moment." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "6fabbd05-b480-43c6-b43a-d396d81bd687", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │\n", - " ┌──────────┐ ┌──────────┐ ┌───────┐ \n", - "q0 : ─┤ Rx(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─\n", - " └──────────┘ └──────────┘ └───┬───┘ \n", - " ┌──────────┐ ┌──────────┐ ┌───┴───┐ \n", - "q1 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─\n", - " └──────────┘ └──────────┘ └───────┘ \n", - " ┌──────────┐ ┌──────────┐ \n", - "q2 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├───────────\n", - " └──────────┘ └──────────┘ \n", - "T : │ 0 │ 1 │ 2 │\n" - ] - } - ], - "source": [ - "np.random.seed(42)\n", - "\n", - "circ = Circuit().rx(0, 0.5).rz(1, 0.5).rz(2, 0.5).rx(0, np.pi).rx(1, np.pi).rx(2, np.pi).iswap(0, 1)\n", - "print(circ)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "e2af07ed-33de-4709-9e7c-5e3c3caaa751", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │\n", - " ┌──────────┐ ┌──────────┐ ┌───────┐ ┌─────────────┐ \n", - "q0 : ─┤ Rx(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─┤ DEPO(0.023) ├─\n", - " └──────────┘ └──────────┘ └───┬───┘ └──────┬──────┘ \n", - " ┌──────────┐ ┌──────────┐ ┌───┴───┐ ┌──────┴──────┐ \n", - "q1 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─┤ DEPO(0.023) ├─\n", - " └──────────┘ └──────────┘ └───────┘ └─────────────┘ \n", - " ┌──────────┐ ┌──────────┐ \n", - "q2 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├───────────────────────────\n", - " └──────────┘ └──────────┘ \n", - "T : │ 0 │ 1 │ 2 │\n" - ] - } - ], - "source": [ - "noisy_circ = noise_model.apply(circ)\n", - "\n", - "print(noisy_circ)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "9304dcf1-a1e8-4e41-a6b5-769841f4eefe", - "metadata": {}, - "outputs": [], - "source": [ - "simulator = LocalSimulator() # noise free simulator\n", - "task = simulator.run(circ, shots=10_000)\n", - "free_probs = task.result().measurement_probabilities" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "0e1d9cfe-03d6-406b-b4ab-89166a907681", - "metadata": {}, - "outputs": [], - "source": [ - "noisy_simulator = LocalSimulator(\"braket_dm\")\n", - "noisy_task = noisy_simulator.run(noisy_circ, shots=10_000)\n", - "noisy_probs = noisy_task.result().measurement_probabilities" - ] - }, - { - "cell_type": "markdown", - "id": "b3f370bd-a8b3-4d5b-a724-da549fc4c81f", - "metadata": {}, - "source": [ - "
\n", - "Note: The below section runs tasks on the Rigetti Ankaa-2 device. When you run this notebook, make sure the device is currently available. You can find QPU availability windows on the Devices page in the Amazon Braket Console.\n", - "
\n", - "\n", - "
\n", - "Note: Running the circuit below will result in charges on your AWS account.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "c8f4664a-0527-46fb-87f2-2a0c85f0bd79", - "metadata": {}, - "outputs": [], - "source": [ - "rigetti_task = rigetti.run(circ, shots=10_000, disable_qubit_rewiring=True)\n", - "rigetti_result = rigetti_task.result()\n", - "rigetti_probs = rigetti_result.measurement_probabilities" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "1676a45c-5ef8-49cc-b227-69f69fa2004a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Ankaa-2noisy_simfree_sim
1100.1866NaNNaN
0110.09960.0061NaN
0010.05280.0055NaN
1110.45550.92140.9384
1010.12540.06700.0616
0100.0229NaNNaN
1000.0443NaNNaN
0000.0129NaNNaN
\n", - "
" - ], - "text/plain": [ - " Ankaa-2 noisy_sim free_sim\n", - "110 0.1866 NaN NaN\n", - "011 0.0996 0.0061 NaN\n", - "001 0.0528 0.0055 NaN\n", - "111 0.4555 0.9214 0.9384\n", - "101 0.1254 0.0670 0.0616\n", - "010 0.0229 NaN NaN\n", - "100 0.0443 NaN NaN\n", - "000 0.0129 NaN NaN" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "free_sim = pd.DataFrame.from_dict(free_probs, orient=\"index\").rename(\n", - " columns={0: \"free_sim\"}\n", - ")\n", - "noisy_sim = pd.DataFrame.from_dict(noisy_probs, orient=\"index\").rename(\n", - " columns={0: \"noisy_sim\"}\n", - ")\n", - "Ankaa = pd.DataFrame.from_dict(rigetti_probs, orient=\"index\").rename(\n", - " columns={0: \"Ankaa-2\"}\n", - ")\n", - "df = Ankaa.join(noisy_sim).join(free_sim)\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "472e6850-2603-4174-bf92-b04eb0c38c2f", - "metadata": {}, - "source": [ - "We can compute the fidelity between the free simulation and Rigetti, as well as the noisy simulation and Rigetti. " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "5b7d1740-cb46-433e-8c2b-7e8b7c10fb4e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Total fidelity between Ankaa-2 and noise-free simulator is 0.7416798056649024\n", - "\n", - "Total fidelity between Ankaa-2 and noisy simulator is 0.7811919904651835\n" - ] - } - ], - "source": [ - "def fidelity(p, q):\n", - " return np.sum(np.sqrt(p * q))\n", - "\n", - "\n", - "f_free_Ankaa = fidelity(df[\"free_sim\"], df[\"Ankaa-2\"])\n", - "f_noisy_Ankaa = fidelity(df[\"noisy_sim\"], df[\"Ankaa-2\"])\n", - "\n", - "print(f\"\\nTotal fidelity between Ankaa-2 and noise-free simulator is {f_free_Ankaa}\")\n", - "print(f\"\\nTotal fidelity between Ankaa-2 and noisy simulator is {f_noisy_Ankaa}\")" - ] - }, - { - "cell_type": "markdown", - "id": "fd4d88b7-015e-445b-ba26-1bdbc6a2bd16", - "metadata": {}, - "source": [ - "To better visualize, we can also plot the output probability distributions from each circuit:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "9329ed72-2f30-4383-b48f-0d50e1a5dd11", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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/f31zjvv3PeYdbfp06cre/bsatCggV566SVNnz49RZ3k48SIESM0YcIE6/+Bzz33nP7888/7LmPHjh3y8/NTzZo1deXKFUlp/79rypQpql27tvz9/eXq6qoSJUro66+/TtO65cqVyyZQJ3vxxRclKcUxAUDG40w18B+wYMECFSpUSFWqVElT/U6dOmnq1Kl66aWX9O6772rTpk0aOnSo9uzZo59//tmm7sGDB9W6dWu98cYbeu211zRixAg1atRI48eP1/vvv69u3bpJkoYOHaoWLVpo3759Nmcvb926pXr16qlSpUoaPny4lixZosjISCUmJmrQoEHWemPGjFHjxo316quvKiEhQTNnztTLL7+shQsXqkGDBjZ9WrFihX788Uf16NFDuXLluu/APy1atFDBggU1dOhQbdu2Td9++638/f01bNgwa5127drpxx9/VJs2bVSpUiWtXr06xXLv59NPP5WTk5N69+6t2NhYDR8+XK+++qo2bdpkrRMdHa327dvrueee09ChQxUTE6MxY8Zo3bp12r59u3x9fe22vXv3bjVs2FBlypTRoEGD5OrqqoMHD9qE16SkJDVu3Fhr167V66+/ruLFi2vnzp36/PPPtX///nvej1m8eHF99913euedd5QvXz69++67kiQ/Pz9rWBg8eLBcXFzUu3dvxcfHy8XFRStWrFD9+vUVEhKiyMhIOTk5Wb88/vHHH6pQoYIkKSYmRpUqVbIGNz8/Py1evFgdO3ZUXFzcPQdES8u6p+bWrVuqX7++atSooeHDh2v69Onq0aOHPD099cEHH+jVV19Vs2bNNH78eLVt21aVK1dWwYIF79vu/cTFxenbb79Vq1at1LlzZ12+fFmTJk1SeHi4Nm/erLJly8rPz09ff/21unbtqhdffFHNmjWTJJUpU0aS9Pvvv6t+/foqVKiQoqKidP36dY0dO1ZVq1bVtm3bUrzvX375ZRUpUkRDhgxJ8aNVWq1du1Zz585Vt27dlC1bNn3xxRdq3ry5jh8/rpw5c0q6vT+qV68ub29v9enTR1mzZtU333yjmjVravXq1anez5qQkKDw8HDFx8erZ8+eCgwM1MmTJ7Vw4UJdunRJPj4+atOmjTp37qxdu3apVKlS1nn//PNP7d+/Xx9++GGqfT9z5ozq1q0rPz8/9evXT76+vjp69Kjmzp2bpnVv2bKlihcvrk8//VSLFi3Sxx9/rBw5cuibb75R7dq1NWzYME2fPl29e/fWc889pxo1aqRjy6YuLce+7777Tp06dVKFChX0+uuvS5IKFy4sKf37o1u3bvLz89OAAQN09erVdPc3OjpaXl5e6tWrl7y8vLRixQoNGDBAcXFx+uyzz2zqXrx4UfXq1VOzZs3UokULzZkzR3379lXp0qVVv359Sbd/0KxTp46OHz+uN998U3ny5NF3332nFStWpKtf06dPV7NmzeTi4qJWrVrp66+/1p9//qnnnnsuRd0ZM2bo8uXLeuONN2SxWDR8+HA1a9ZMhw8fTvUWkj///FPh4eEqX768fvnlF7m7u0tK+/9dX3/9tUqWLKnGjRsrS5YsWrBggbp166akpCR17949Xeua7PTp05Juh24AD5kBIFOLjY01JBlNmjRJU/0dO3YYkoxOnTrZlPfu3duQZKxYscJaFhQUZEgy1q9fby1bunSpIclwd3c3jh07Zi3/5ptvDEnGypUrrWURERGGJKNnz57WsqSkJKNBgwaGi4uLcfbsWWv5tWvXbPqTkJBglCpVyqhdu7ZNuSTDycnJ2L17d4p1k2RERkZa/46MjDQkGR06dLCp9+KLLxo5c+a0/r1161ZDkvH222/b1GvXrl2KNu1ZuXKlIckoXry4ER8fby0fM2aMIcnYuXOndZ38/f2NUqVKGdevX7fWW7hwoSHJGDBgQIq+J/v8888NSTbb7G7fffed4eTkZPzxxx825ePHjzckGevWrbvnehjG7X3eoEEDu+tXqFAhm/2UlJRkFClSxAgPDzeSkpKs5deuXTMKFixoPP/889ayjh07Grlz5zbOnTtn0/Yrr7xi+Pj4pNj/d0rLuh85csSQZEyZMsValvz+GzJkiLXs4sWLhru7u2GxWIyZM2day/fu3Zvq++duU6ZMMSQZR44csZaFhoYaoaGh1r8TExNt3gvJyw4ICLB5P549ezbV91jZsmUNf39/4/z589ayv/76y3BycjLatm2bop+tWrWyu23SSpLh4uJiHDx40GZ5koyxY8day5o2bWq4uLgYhw4dspadOnXKyJYtm1GjRg1rWfL7JvmYsH37dkOSMXv27FT7cOnSJcPNzc3o27evTfmbb75peHp6GleuXEl13p9//tmQZPz555/3XU97+/n111+3liUmJhr58uUzLBaL8emn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M4Fp1bRpUwUHB2vgwIEKCgqyDsJ1dzCfPXu2li1bpoYNG6pbt26Ki4uTJMXHx6tevXpatWqVypYtq44dO+rmzZtatGiRmjRporFjx9qcTUxv/fRKDtBt27bVc889p0KFCunHH3/UmDFj5OXlZXee+fPna9GiRWrUqJGqVKmiNWvWaNq0aTp06NB9Q+Lly5fVtGlTrVy5UiNHjlSvXr0kSRcuXNDbb7+t6tWr64UXXlD27Nl1+PBhzZ8/X4sXL9aaNWv03HPPWdvZs2ePBgwYoFq1aunFF1+Up6en9u7dqxkzZmjRokXatm2bgoKCTG+XjLBq1SpJUt26dVNMCw8PV3R0tFavXm36iofo6GjdunVLbdu2VdasWe3Wef/993X8+HEtXLhQFovF1HKS286Shf+iAADA449vLMBDVLNmTdWsWVPR0dGSlOoltffStGlTNW3aVAMHDlRwcHCqbSxZskRLly5VWFiYTfmgQYO0atUqffTRRxo4cKA16Fy+fFm1a9fWu+++q2bNmilPnjym6qfH+fPn9csvv6hYsWLWwPraa69p0KBBmjVrlvXM9d0WLFigVatWWe8HvnXrlsLCwrRq1Spt3LhRlSpVsjtfTEyM6tevr127dmnatGl67bXXrNOyZ8+u48ePK2/evDbz7N69W5UqVdL777+v3377zVpevHhx/fvvv8qRI4dN/ZUrVyosLEwff/yxJk6cmKbtMHr0aF26dClNdaXb74GyZcvet96BAwfk5eVldwC7IkWKWOuYYRiGJk+eLCn1S7/XrFmjMWPGaNSoUSpcuLCp5Rw/fly///67cufOrdKlS5tqAwAA4FEiVAOZRJMmTVIE6qSkJH399dcqXLiwTUCWpGzZsmnAgAFq3Lix5s6dqx49eqS7fnp99913SkhIUJs2baxlbdu21aBBgzRp0qRUQ3Xr1q1tBthydnZWRESEVq1apT///NNuqD506JDCw8P177//av78+apXr57NdFdX1xSBWpJKliypWrVqaenSpbp586b1rOmdl1PfqVatWipZsqR+//33+2+A/2/06NE6duxYmusHBwenKVTHxsbK39/f7jRvb29rHTNWr16tQ4cOqVq1anr66adTTL969arat2+vypUrq2fPnqaWcfPmTbVp00bx8fEaNmzYfUcYBwAAeBwQqoFMokKFCinK9u3bp4sXLypPnjwaOHBgiulnz56VJO3du9dU/fSaNGmSLBaLzRnjwoULq0qVKlq/fr327Nmj4sWLp5gvJCQkRVm+fPkkye4Z371796pq1apKTEzUihUrVLFiRbv92bFjh4YPH661a9fq9OnTunnzps30c+fOKXfu3Na/V61apdGjR2vTpk06d+6cEhMTrdPSMwjd0aNH01z3cZF82X5qP3z07t3bes/1/QZCsycpKUnt2rXTmjVr1LlzZ5sfXgAAAB5nhGogkwgICEhRduHCBUm3L2nevXt3qvNevXrVVP302LRpk3bt2qVatWqpQIECNtPatm2r9evXa/LkyXafW518lvVOyffb3rp1K8W0/fv36+LFi6pSpYpKlSpltz/r169X7dq1Jd2+B7lIkSLy8vKSxWLRvHnz9Ndffyk+Pt5af/bs2WrZsqW8vLwUHh6u4OBgeXh4WAdSS8+Z54fFx8cn1TPRyffYp3bG/V5iY2P1008/ydvbWy1atEgxfdWqVRo/frw+++wzFS1aNN3tJyUlqUOHDpoxY4Zee+01jR8/Pt1tAAAAOAqhGsgk7A0KlRxGmzdvrjlz5ty3jfTWT4/kM50rV65MdQCradOmaciQIakOgpVWjRs3VsGCBRUVFaUXXnhBv/76qzw9PW3qfPLJJ4qPj9cff/yhatWq2UzbuHGj/vrrL5uyqKgoubm5aevWrdb7k5PNnDkzXf17WPdUFylSRBs2bNDp06dT3FedfC/13X1Pi+nTp+v69etq27atPDw8UkzfsWOHJOm9996z+8zxffv2yWKxyMfHJ8V6JyUlqX379po2bZpatWql6OhoU2e6AQAAHIVQDWRixYsXl7e3t7Zs2WJzf3BG1U+rq1evaubMmfLw8FCrVq3s1vnzzz/1999/a+HChXrxxRcfeJmRkZFydnbWRx99pPr16+vXX3+1GV380KFDypEjR4pAfe3aNW3bti1Fe4cOHVLJkiVThNJ///1Xhw8fTlffHtY91aGhodqwYYOWLVumtm3b2kxbunSptU56Jf8gktoAZaVKlUr1svBJkybJx8dHL730UopAfmegbtmypb777jvuowYAAE8cQjWQiWXJkkVdu3bVsGHD1Lt3b40YMSJFUN61a5f8/f3l7++f7vppNXv2bF2+fFlt27bVt99+a7fOsmXLFB4erkmTJmVIqJakDz/8UE5OTvrggw9U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KQK1JD399NP64osvVLNmzUffMZgSHx+vrl27qnTp0nanHzt2TAMHDnzEvYJZpUqVUsWKFdW1a1e703fs2MEXgSeMr6+vLBZLqtMNw7jndDxe+CEzc2nYsKFef/11TZo0SeXKlbOZtn37dnXt2lWNGjVyUO9gBj+UZB41a9ZU7969NX36dOXKlctm2rlz59S3b18yiwjVDuPq6nrPMyeXL1+Wq6vrI+wRHkTZsmWVP39+RURE2J3+119/EaqfIFWrVtW+fftSnZ4tWzbu1XzCZMuWTR988IEqVqxod/qBAwf0xhtvPOJewSx+yMxcxo0bp9atWyskJETZs2e33vp25swZXbp0SeHh4Ro3bpyDe4n04IeSzGP8+PF64YUXlDt3bpUuXdrmltWdO3eqRIkSWrhwoYN76XiEagdp2bKlIiIi9Pnnn6tOnTry9vaWdPsSxeXLl6tXr15q1aqVg3uJtGrQoIEuXbqU6vQcOXIwANITZMyYMfecXrhwYa1cufIR9QYZIfk++dDQULvTfX19xRAjTw5+yMxcsmfPrsWLF2vv3r12B28tVqyYg3uI9OKHkswjf/78+uuvv7R06VJt3LjR+vmsUKGChgwZorp16/7nR/6WGKjMYeLj4/X2229r8uTJSkxMtF4ik5CQoCxZsqhjx476/PPPOVsNABlg4sSJun79ut58802702NiYjR+/HhFRkY+4p7BjCFDhujmzZup7q8TJ05owIABmjJlyiPuGYA77dmzxyaI8UMJMitCtYPFxcVp69atNgebkJAQ65lrAI7DI+8AwPF45B3gePa+E1WpUkXPPfecg3v2eCBUA48AXwieLDzyDgAeHzwi7cmUkJCgefPm2Q1iTZo0uedAZnh88J0obQjVj6mYmBh98803GjBggKO7ggzAF4Iny0svvaRTp05pypQpqT7yLk+ePDzyLhPhmPvk4Qt75nG/R979/fffCg0N5f/QJ8jBgwcVHh6uU6dOqWLFijZBbNOmTcqXL58WL16sp556ysE9xf3wnShtCNWPKULYk4UvBJlLtmzZtGbNmhQjlibbunWratasybONMxGOuU8WvrBnLk5OTml65B2fzyfH888/L09PT02bNi3FLY1xcXFq27atrl+/rqVLlzqoh0grvhOlDaN/O8jff/99z+n3epwPHj88Azdz4ZF3mQ/H3Mwl+XFa27dvT/ULe/fu3fnC/oTgkXeZz7p167R582a7YwR5e3tr8ODBqe5vPF74TpQ2hGoHKVu2rCwWi91HuCSXE8KeHHwhyFx45F3mwzE3c+ELe+bCI+8yH19fXx09elSlSpWyO/3o0aPy9fV9tJ2CKXwnShtCtYPkyJFDw4cPV506dexO3717txo1avSIewWz+EKQuYwaNUpJSUl65ZVXUn3k3YgRIxzcS6QHx9zMhS/smUvr1q117dq1VKcHBgbyuLsnTKdOndS2bVt99NFHqlOnjs0tGsuXL9fHH3+snj17OriXSAu+E6UNodpBQkJCdOrUKQUFBdmdfunSJULYE4QvBJmLq6urvv76aw0bNoxH3mUSHHMzF76wZy6dO3e+5/SAgAD+D33CDBo0SJ6envrss8/07rvvWq8EMgxDgYGB6tu3r/r06ePgXiIt+E6UNgxU5iA///yzrl69qtdee83u9IsXL2r+/PmKiIh4xD0DIEnnzp3T5MmT7Y4s3K5dO/n5+Tm4h0gPjrmZz7BhwzRmzBidPn06xRf2t99+my/sTxiOuZnXkSNHbPZpwYIFHdwjpBefz/sjVAMZhANO5vHnn38qPDxcHh4eCgsLS3EW7Nq1a1q6dKnKly/v4J4C4Av7k49j7n/PiRMnFBkZqcmTJzu6K7gPPp9pQ6h+THGwebJwwMlcKlWqpGeeeUbjx49PMXiVYRjq0qWL/v77b23YsMFBPURG45ibubA/nywcc/97eIzhk4PPZ9oQqh9THGyeLBxwMhd3d3dt375dxYoVszt97969KleunK5fv/6Ie4aHhWNu5sL+fLJwzM185s+ff8/phw8f1rvvvstn9AnA5zNtGKjMQdJysMGT46+//lJ0dLTdR/JYLBa98847KleunAN6BjMCAwO1efPmVP8D2bx5s/VqBDwZOOZmLuzPzIVjbubTtGnTVB9jmIzHGD4Z+HymDaHaQTjYZC4ccDKX3r176/XXX9fWrVvtjiw8ceJEHh/xhOGYm7mwPzMXjrmZT+7cufXVV1+pSZMmdqfv2LFDISEhj7hXMIPPZ9oQqh2Eg03mwgEnc+nevbty5cqlzz//XF999ZX18jRnZ2eFhIQoOjpaLVq0cHAvkR4cczMX9mfmwjE38wkJCdHWrVtT/Yze70cxPD74fKYN91Q7SOPGjVW2bFkNGjTI7vS//vpL5cqVU1JS0iPuGcyaNWuWPv/8c23dujXFAadXr14ccJ5QN2/e1Llz5yRJuXLlUtasWR3cI5jBMTdzYX9mXhxzM4c//vhDV69eVb169exOv3r1qrZs2aLQ0NBH3DM8CD6fqSNUOwgHm8yLAw7w+OGYm7mwPwEAjxNCNQAAAAAAJjk5ugMAAAAAADypCNUAAAAAAJhEqAYAAAAAwCRCNQAAAAAAJhGqAQAAAAAwiVANAAAAAIBJhGoAAAAAAEz6fzSHt11n6r/FAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "%matplotlib inline\n", - "\n", - "df.plot.bar(\n", - " title=\"Comparing noise-free simulator, noisy simulator, and Ankaa-2\",\n", - " figsize=(12, 6),\n", - ")\n", - "\n", - "text = f\"f_free_Ankaa = {f_free_Ankaa:.3f} \\nf_noise_model_Ankaa = {f_noisy_Ankaa:.3f}\"\n", - "plt.text(1, 0.5, text, fontsize=14)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "aa8ffab8-e062-4c33-9c9d-4a312cd76b63", - "metadata": {}, - "source": [ - "We confirm that the simulator with a noise model is closer to the distribution produced by Ankaa-2." - ] - }, - { - "cell_type": "markdown", - "id": "c4571a5e-2f8d-4767-b28e-a527d2490830", - "metadata": {}, - "source": [ - "### Smaller, reduced noise models\n", - "\n", - "The full Rigetti Ankaa-2 noise model contains due to non-uniform qubit noise. We can obtain simpler, smaller noise models by coarse graining the model above.\n", - "\n", - "Here, we consider taking the average over all qubits for the $T_1$, $T_2$, depolarizing, and readout depolarizing rates. This is a substantially smaller noise model, but may be less accurate. \n", - "\n", - "We use the `from_filter` function to extract all instructions with amplitude dampening noise in the model. We then compute the mean of the error probabilities. " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "eac8479f-4b29-42d8-a15a-ba10aae82d3f", - "metadata": {}, - "outputs": [], - "source": [ - "avg_depo = np.mean(\n", - " [\n", - " n.noise.parameters\n", - " for n in noise_model.from_filter(noise=Depolarizing).instructions\n", - " ]\n", - ")\n", - "avg_readout = np.mean(\n", - " [n.noise.parameters for n in noise_model.from_filter(noise=BitFlip).instructions]\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "d1a64cae-226c-45d2-9af3-4b5b7a36c7a4", - "metadata": {}, - "source": [ - "Now we construct a new noise model with the mean values above:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "e49eb24c-5f24-4084-9d4c-c2e7e82fc259", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Gate Noise:\n", - " Depolarizing(0.010099107504894678), GateCriteria(None, None)\n", - "Readout Noise:\n", - " BitFlip(0.06397619047619048), ObservableCriteria(None, None)\n" - ] - } - ], - "source": [ - "simple_noise_model = NoiseModel()\n", - "simple_noise_model.add_noise(Depolarizing(avg_depo), GateCriteria())\n", - "simple_noise_model.add_noise(BitFlip(avg_readout), ObservableCriteria())\n", - "\n", - "print(simple_noise_model)" - ] - }, - { - "cell_type": "markdown", - "id": "b44bbbd1-fb65-4b8f-8dfa-0ea5aa7979b2", - "metadata": {}, - "source": [ - "We can see the resultant circuits contain qubit-independent noise:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "c83e96f6-54b0-445b-bcdd-8a7a16691b62", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │\n", - " ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ ┌───────┐ ┌────────────┐ \n", - "q0 : ─┤ Rx(0.50) ├─┤ DEPO(0.01) ├─┤ Rx(3.14) ├─┤ DEPO(0.01) ├─┤ ISWAP ├─┤ DEPO(0.01) ├─\n", - " └──────────┘ └────────────┘ └──────────┘ └────────────┘ └───┬───┘ └────────────┘ \n", - " ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ ┌───┴───┐ ┌────────────┐ \n", - "q1 : ─┤ Rz(0.50) ├─┤ DEPO(0.01) ├─┤ Rx(3.14) ├─┤ DEPO(0.01) ├─┤ ISWAP ├─┤ DEPO(0.01) ├─\n", - " └──────────┘ └────────────┘ └──────────┘ └────────────┘ └───────┘ └────────────┘ \n", - " ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ \n", - "q2 : ─┤ Rz(0.50) ├─┤ DEPO(0.01) ├─┤ Rx(3.14) ├─┤ DEPO(0.01) ├──────────────────────────\n", - " └──────────┘ └────────────┘ └──────────┘ └────────────┘ \n", - "T : │ 0 │ 1 │ 2 │\n" - ] - } - ], - "source": [ - "simple_noisy_circ = simple_noise_model.apply(circ)\n", - "print(simple_noisy_circ)" - ] - }, - { - "cell_type": "markdown", - "id": "e2c20b79-cbf2-4897-80b3-452c78d56a03", - "metadata": {}, - "source": [ - "We run the circuit on a noisy simulator below" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "a1bb19e8-6824-4a50-b9fb-ae06c14359b6", - "metadata": {}, - "outputs": [], - "source": [ - "simple_noisy_task = noisy_simulator.run(simple_noisy_circ, shots=100_000)\n", - "simple_noisy_probs = simple_noisy_task.result().measurement_probabilities" - ] - }, - { - "cell_type": "markdown", - "id": "76418e5c-be5b-4b3a-8916-c0f56f003cd7", - "metadata": {}, - "source": [ - "and add it to the previous dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "b4d27a95-612d-4dea-9f6a-98d4525b0a70", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Ankaa-2noisy_simfree_simsimple_noisy_sim
1100.1866NaNNaN0.01230
0110.09960.0061NaN0.01795
0010.05280.0055NaN0.00156
1110.45550.92140.93840.89030
1010.12540.06700.06160.07659
0100.0229NaNNaN0.00019
1000.0443NaNNaN0.00108
0000.0129NaNNaN0.00003
\n", - "
" - ], - "text/plain": [ - " Ankaa-2 noisy_sim free_sim simple_noisy_sim\n", - "110 0.1866 NaN NaN 0.01230\n", - "011 0.0996 0.0061 NaN 0.01795\n", - "001 0.0528 0.0055 NaN 0.00156\n", - "111 0.4555 0.9214 0.9384 0.89030\n", - "101 0.1254 0.0670 0.0616 0.07659\n", - "010 0.0229 NaN NaN 0.00019\n", - "100 0.0443 NaN NaN 0.00108\n", - "000 0.0129 NaN NaN 0.00003" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "simple_noisy_sim = pd.DataFrame.from_dict(simple_noisy_probs, orient=\"index\").rename(\n", - " columns={0: \"simple_noisy_sim\"}\n", - ")\n", - "df = df.join(simple_noisy_sim)\n", - "df" - ] - }, - { - "cell_type": "markdown", - "id": "b1699bc2-712f-4a99-b9d6-0a0920114a13", - "metadata": {}, - "source": [ - "We compute the fidelity between the simple noise model and the QPU:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "d7710e0b-29ac-4968-aa00-e23cb8b32269", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Total fidelity between Ankaa-2 and full noise model is: 0.7811919904651835\n", - "\n", - "Total fidelity between Ankaa-2 and simple noise model is: 0.8437069124308016\n", - "\n", - "Total fidelity between Ankaa-2 and noise-free is: 0.7416798056649024\n" - ] - } - ], - "source": [ - "f_simple = fidelity(df[\"simple_noisy_sim\"], df[\"Ankaa-2\"])\n", - "\n", - "print(f\"\\nTotal fidelity between Ankaa-2 and full noise model is: {f_noisy_Ankaa}\")\n", - "print(f\"\\nTotal fidelity between Ankaa-2 and simple noise model is: {f_simple}\")\n", - "print(f\"\\nTotal fidelity between Ankaa-2 and noise-free is: {f_free_Ankaa}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "e36e19d0-664a-4cb4-a2e3-0061cd60a6c1", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9UAAAIcCAYAAAD42o3XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB7xUlEQVR4nO3dd3xO5//H8fedyF5GCCESI7W3UrREpaJ21ShKzNq0qlSHWbP4Wi2tmi2lVdSoVRVtUbNqa42gRYySECPI+f3hl7vuZh8ho6/n45FH5ZzrnPM55+S+e7/vc53rWAzDMAQAAAAAAFLNLr0LAAAAAAAgsyJUAwAAAABgEqEaAAAAAACTCNUAAAAAAJhEqAYAAAAAwCRCNQAAAAAAJhGqAQAAAAAwiVANAAAAAIBJhGoAAAAAAEwiVAMAMjyLxaJhw4aldxkJmjdvniwWi8LDw9Nl+xn52GRkYWFhslgsCgsLS5ftd+jQQe7u7umybQBA2iJUA0AmcOLECXXr1k2FCxeWs7OzPD09VaNGDU2ZMkW3bt1K7/KQCR0+fFjDhg1Lty8DMqOPP/5YFotFVatWTe9S0tTNmzf10UcfqW7dusqXL588PDxUoUIFzZgxQ/fv30/v8gAgw8uW3gUAAJK2Zs0atWjRQk5OTmrfvr1Kly6tmJgY/fzzz3rrrbd06NAhffrpp+ld5mN169YtZcuWMf+X1a5dO73yyitycnJK71JS5fDhwxo+fLiCgoIUEBCQ3uVkCgsXLlRAQIB27typ48ePq2jRouldUpo4efKk+vTpozp16qh///7y9PTU+vXr1bNnT/3yyy+aP39+epcIABlaxvyEAgCQJJ06dUqvvPKK/P399cMPPyhfvnzWeb169dLx48e1Zs2adKzw8YmNjVVMTIycnZ3l7Oyc3uUkyt7eXvb29uldRoZx8+ZNubq6pncZae7UqVPatm2bli1bpm7dumnhwoUaOnRoepeVJvLmzasDBw6oVKlS1mndunVTp06dNHfuXL3//vtZ5gsEAHgc6P4NABnY+PHjdePGDc2ePdsmUMcpWrSo+vXrZ/393r17GjlypIoUKSInJycFBATonXfe0Z07d2yWCwgIUMOGDRUWFqbKlSvLxcVFZcqUsd5fumzZMpUpU0bOzs6qVKmSfv31V5vl4+4HPXnypEJCQuTm5iZfX1+NGDFChmHYtJ0wYYKqV6+uXLlyycXFRZUqVdLSpUvj7YvFYlHv3r21cOFClSpVSk5OTlq3bp113sP3DQ8bNkwWi0XHjx9Xhw4dlD17dnl5ealjx466efOmzXpv3bqlvn37ytvbWx4eHmrcuLH++uuvFN+LPG3aNJUqVUqurq7KkSOHKleurEWLFlnnJ3RP9aMe36CgIAUFBcWrpUOHDsleVT59+rR69uypYsWKycXFRbly5VKLFi1s6ps3b55atGghSapdu7YsFku8+4s//vhj63nw9fVVr169dO3atXh1li5dWnv27FHNmjXl6uqqd955R5K0e/duhYSEyNvbWy4uLipUqJA6deqUZO2S9O2336pBgwby9fWVk5OTihQpopEjR8brhhy37cOHD6t27dpydXVV/vz5NX78+Hjr/PPPP9W0aVO5ubkpT548euONN+K9JpKzcOFC5ciRQw0aNFDz5s21cOHCeG3Cw8NlsVg0YcIEffrpp9bX4dNPP61du3Ylu419+/Ypd+7cCgoK0o0bNySl/PUzd+5cPf/888qTJ4+cnJxUsmRJzZgxI0X75u3tbROo47z00kuSpCNHjqRoPQDwX8WVagDIwFatWqXChQurevXqKWrfpUsXzZ8/X82bN9ebb76pHTt2aMyYMTpy5IiWL19u0/b48eNq06aNunXrpldffVUTJkxQo0aNNHPmTL3zzjvq2bOnJGnMmDFq2bKljh07Jju7f76LvX//vurVq6dnnnlG48eP17p16zR06FDdu3dPI0aMsLabMmWKGjdurLZt2yomJkaLFy9WixYttHr1ajVo0MCmph9++EFfffWVevfuLW9v72QDZMuWLVWoUCGNGTNGe/fu1WeffaY8efJo3Lhx1jYdOnTQV199pXbt2umZZ57Rli1b4m03MbNmzVLfvn3VvHlz9evXT7dv39b+/fu1Y8cOtWnTJsllH/X4mrVr1y5t27ZNr7zyigoUKKDw8HDNmDFDQUFBOnz4sFxdXVWzZk317dtXU6dO1TvvvKMSJUpIkvW/w4YN0/DhwxUcHKwePXro2LFjmjFjhnbt2qWtW7fKwcHBur0rV67oxRdf1CuvvKJXX31VPj4+unjxourWravcuXPr7bffVvbs2RUeHq5ly5YlW/+8efPk7u6u/v37y93dXT/88IOGDBmiqKgoffjhhzZtr169qnr16qlZs2Zq2bKlli5dqkGDBqlMmTJ68cUXJT34UqVOnTo6c+aM+vbtK19fX33++ef64YcfUnVcFy5cqGbNmsnR0VGtW7e2Ho+nn346XttFixbp+vXr6tatmywWi8aPH69mzZrp5MmTNsfuYbt27VJISIgqV66sb7/9Vi4uLpJS/vqZMWOGSpUqpcaNGytbtmxatWqVevbsqdjYWPXq1StV+xrnwoULkh6EbgBAEgwAQIYUGRlpSDKaNGmSovb79u0zJBldunSxmT5gwABDkvHDDz9Yp/n7+xuSjG3btlmnrV+/3pBkuLi4GKdPn7ZO/+STTwxJxubNm63TQkNDDUlGnz59rNNiY2ONBg0aGI6OjsalS5es02/evGlTT0xMjFG6dGnj+eeft5kuybCzszMOHToUb98kGUOHDrX+PnToUEOS0alTJ5t2L730kpErVy7r73v27DEkGa+//rpNuw4dOsRbZ0KaNGlilCpVKsk2c+fONSQZp06dsk571ONbq1Yto1atWvG2FRoaavj7+9tM+/d+/Pt4G4ZhbN++3ZBkLFiwwDrt66+/jrddwzCMixcvGo6OjkbdunWN+/fvW6dPnz7dkGTMmTPHpk5JxsyZM23WsXz5ckOSsWvXrni1JCeh+rt162a4uroat2/fjrfth/fpzp07Rt68eY2XX37ZOm3y5MmGJOOrr76yTouOjjaKFi2a4P4nZPfu3YYkY+PGjYZhPPhbL1CggNGvXz+bdqdOnTIkGbly5TL+/vtv6/Rvv/3WkGSsWrXKOi00NNRwc3MzDMMwfv75Z8PT09No0KCBzT4mdDwSe/0kdNxCQkKMwoULJ7t/Cblz545RsmRJo1ChQsbdu3dNrQMA/ivo/g0AGVRUVJQkycPDI0Xtv/vuO0lS//79baa/+eabkhTv3uuSJUuqWrVq1t/jRjR+/vnnVbBgwXjTT548GW+bvXv3tv47rvt2TEyMvv/+e+v0uCtu0oMri5GRkXruuee0d+/eeOurVauWSpYsmcye/qN79+42vz/33HO6cuWK9djFdR+Puyocp0+fPilaf/bs2fXnn3+mqOvuv6XF8TXj4eN99+5dXblyRUWLFlX27NkTPOb/9v333ysmJkavv/66zZXzrl27ytPTM97fkZOTkzp27GgzLXv27JKk1atX6+7du6brv379ui5fvqznnntON2/e1NGjR23auru769VXX7X+7ujoqCpVqtgcy++++0758uVT8+bNrdNcXV312muvpbimhQsXysfHR7Vr15b04G+9VatWWrx4cYKjY7dq1Uo5cuSw/v7cc89JSvgcb968WSEhIapTp46WLVsWb8C7lL5+Hm4XGRmpy5cvq1atWjp58qQiIyNTvK9xevfurcOHD2v69OkZdpBAAMgoCNUAkEF5enpKehAsUuL06dOys7OLN6BQ3rx5lT17dp0+fdpm+sPBTpK8vLwkSX5+fglOv3r1qs10Ozs7FS5c2GbaU089JUk29++uXr1azzzzjJydnZUzZ07lzp1bM2bMSPCDfqFChZLbzST3IS7IxNUad0z+vd6UDro0aNAgubu7q0qVKgoMDFSvXr20detWU7Wl9viadevWLQ0ZMkR+fn5ycnKSt7e3cufOrWvXrqUoXMX9nRQrVsxmuqOjowoXLhzv7yh//vxydHS0mVarVi29/PLLGj58uLy9vdWkSRPNnTs3RfcxHzp0SC+99JK8vLzk6emp3LlzW4Pzv+svUKCALBaLzbQcOXLYHMvTp0+raNGi8dr9e/8Sc//+fS1evFi1a9fWqVOndPz4cR0/flxVq1ZVRESENm3aFG+Z5P4u49y+fVsNGjRQhQoV9NVXX8U7jlLKXz9bt25VcHCw3NzclD17duXOndt6f3tc28jISF24cMH68/fffye4zx9++KFmzZqlkSNHqn79+ik6TgDwX0aoBoAMytPTU76+vjp48GCqlvt3eEhMYiNWJzbd+NcAZCnx008/qXHjxnJ2dtbHH3+s7777Ths3blSbNm0SXN/DV9tSIi1rTUiJEiV07NgxLV68WM8++6y++eYbPfvssyka9flRjm9i5zAlzwzu06ePRo0apZYtW+qrr77Shg0btHHjRuXKlUuxsbHJLp9aCZ0zi8WipUuXavv27erdu7f++usvderUSZUqVbIOwJWQa9euqVatWvrtt980YsQIrVq1Shs3brTeI//v+h/3+Zce3Od//vx5LV68WIGBgdafli1bSlKCA5altC4nJyc1aNBAO3bssPaqeFhKXz8nTpxQnTp1dPnyZU2aNElr1qzRxo0b9cYbb0j657j169dP+fLls/40a9Ys3jbnzZunQYMGqXv37nrvvfdSeJQA4L+N/jwAkIE1bNhQn376qbZv327TlTgh/v7+io2N1R9//GEd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+vXrtWnTpnjrcXBw0NGjR1O0jwn59/mV/jmPic27f/++IiIilD9/fkVFRenkyZMqUaKE9Xg9rHbt2po1a5b27dundu3aKSoqSqdOnVLJkiWVN2/eeO2fe+65ePsZdwx27NihEydOxFvm9u3bunz5si5fvpxst/vEGEM9U9y2TKH0GXhu9uzZ6tmzp3r16qXevXsrb968Onr0qAYPHqxGjRrpo48+Us+ePa3tu3TpIgcHB02dOjVF61+yZIm++uorLViwIMFzAwAA0g6hGsgEpkyZokKFCmnu3Ln64IMP9MEHH8jZ2VktW7bUxIkTUxw+PD3jh41s2bIlOl16MFLxv3l7e8cLrZKs9yond6/n33//LUlauHBhku3MPvonqf25f/+fe2HjroQ/fI/1w+ICaXJXzFN6fuL2e9SoUanco5RJar9Tco5Tezzi/pvYvboJrSfuGCQ3aFZ0dLTpUP042Ls+uBJ9/9b9BOffiH0w3cM++Q5gR48eVffu3dWoUSNNmjTJOr1ixYpavny5nnrqKb399tvq1KmTnJ2dNX/+fK1du1Zff/11io7J33//rV69eqlBgwZq165dSnYPAAA8AkI1kAlky5ZNAwYM0IABA3Tu3Dlt2bJFc+fO1YIFC3ThwgWtX7/+idZz+fJlxcbGxgvWERERkpTsc7LjAt6qVavUsGHDx1NkCsTVEVf3v124cMGmXWJSen7i1hMVFSUPD4+02o00k9rjEfffixcvJtg+ofXELXPgwAGVLl360QpOxLCw2yluG7EvQjmezSHH3EkPDmfnZKds2bPp7qW7MmKNePNPxzz4YsLfIflB5jZu3Kh79+6pdu3a8ea5urqqSpUqWr58uY4fP67SpUtbe1Q8PEDcw9avXy+LxaJy5cpp3759OnPmjK5cuaI1a9bEG6k+TtwXJL/++muCvRgAAEDKEaqBTMbX11etW7dWq1atVKxYMX3//fe6detWqruCP4p79+5p+/btqlGjhs30n376SZLi3Sf9b1WrVpUkbd++PV1DdVydYWFhGjhwoM286Oho7d69Wy4uLipWrFiK15nU+alatar27t2rX375RS+88EKa7kta8PT0VOHChXX8+HH99ddfyp8/v838uMeDxYUwT09PFSpUSMePH9eFCxfidTOO+3t4WNWqVbVs2TJt3779sYXq4VuSv0f6H5fkVtwt2VAt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G6c333xTZcuWVcuWLeXm5qZVq1bp2LFjatKkiV599dUk17Fv3z41a9ZMVapUUcmSJZU3b1799ddfWrFihezs7PTGG29Y23br1k2//PKL5s+fr61btyo4OFi+vr6KiIjQ0aNHtWPHDi1atEgBAQGPec8TN2PGDD377LPq2rWrVq1apZIlS+rQoUNauXKlcufOrRkzZti0/+ijj1SjRg21b99eK1assD6neteuXdYRqx9Wr149vf/++xo5cqSKFi2qevXqyd/fX1euXNHx48f1008/6YMPPlCJEiWe5G6nyMCBA/Xtt99q3Lhx+vXXX1WxYkXt3btXGzZs0NNPP219vnqcnTt3qnbt2qpVq1a8AdukB1/efPHFF3J0dFT79u0T3W6BAgU0aNAgjR49Wk8//bReeukl+fv7Kzw8XCtWrFBMTIymTp0a71aFh78QOn/+/INpK25Zp739rKOKe9un/kAAAACYQKgGsqj+/furaNGimjRpkr744gvFxMToqaee0sSJE9W3b994o2D/W+XKlTVo0CCFhYVpzZo1unbtmvLmzavg4GC99dZbNl16LRaL5s2bp/r162vWrFlavXq1bty4oTx58igwMFATJkxQcHDw497lJBUrVky7d+/W8OHDtW7dOq1Zs0a5c+dWx44dNXTo0Hj3npcuXVpbt27VoEGDtG7dOq1fv17PPvustm7dqgkTJsQL1ZI0YsQI1axZU1OnTtWmTZt07do15cqVS4UKFdKwYcPiPZ4ro3Bzc9OWLVusg9Jt3rxZ+fLl05tvvqmhQ4cm+Fi1pKxYsUJXrlxRy5YtlStXriTbjho1SmXLltUnn3yi9evX6/r16/Ly8lLt2rXVr18/vfjii/GWmT9/fvxpv/0zMF2H8g4q7p2qkgEAAEyzGJngGS1RUVHy8vJSZGRkigZXAgD8hwxL/cjkccoUMjcA2ldj7pneZomj5m8DAAAAT05Kcyj3VAMAAAAAYBKhGgAAAAAAk7inGkgH165d0+TJk1PUNiWPRcos9u3bpxUrViTbLiAgINnRyQEAAICMgFANpINr166l+JnDWS1Up2S/a9WqRagGAABApkD3byAdBAQEpOmzhjOLDh06pGifE3pMEwAAAJAREaoBAAAAADCJUA0AAAAAgEmEagAAAAAATCJUAwAAAABgEqEaAAAAAACTCNUAAAAAAJhEqAYA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "df.plot.bar(title=\"Comparing simulators and Ankaa-2\", figsize=(12, 6))\n", - "text = f\"f_free = {f_free_Ankaa:.3f} \\nf_simple_noise_model = {f_simple:.3f} \\nf_noise_model = {f_noisy_Ankaa:.3f}\"\n", - "plt.text(1, 0.5, text, fontsize=14)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "6da72e22-a594-41e7-a4e2-cb82cfe0726a", - "metadata": {}, - "source": [ - "We see that compared to the full noise model, the simple model is less accurate, however, it is still a significant improvement over the noise-free case and has far fewer parameters in the model. " - ] - }, - { - "cell_type": "markdown", - "id": "b2c6b2ba-cb54-43f6-9a89-e29066b5192a", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this notebook, we showed how to construct a noise model for Rigetti Ankaa-2 based only on the available calibration data.\n", - "We used a coarse assumption of gate-independent single-qubit depolarizing noise and gate-dependant two-qubit noise. Our qubit-dependent model could be improved in many ways. We could add gate-dependence noise, or change the depolarizing channel to Pauli channels. " - ] - }, - { - "cell_type": "markdown", - "id": "98989c13", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "braket", - "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.10" - }, - "toc-autonumbering": false, - "toc-showcode": false, - "toc-showmarkdowntxt": false, - "toc-showtags": true - }, - "nbformat": 4, - "nbformat_minor": 5 + "cells": [ + { + "cell_type": "markdown", + "id": "74154c03-d48f-4f41-867b-5e30254ce31a", + "metadata": {}, + "source": [ + "# Noise models on Rigetti\n", + "\n", + "This notebook shows how to construct a noise model from device calibration data for Rigetti Ankaa-2. We compare the measurement outcomes of circuits run on a noisy simulator with the same circuits run on quantum processing units (QPUs), to show that simulating circuits with noise models more closely mimics QPUs.\n", + "\n", + "**Before you begin**: We recommend being familiar with [Noise models on Amazon Braket.](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Noise_models/Noise_models_on_Amazon_Braket.ipynb)\n", + "Additionally, users should be familiar with [Running quantum circuits on QPU devices](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/getting_started/2_Running_quantum_circuits_on_QPU_devices/2_Running_quantum_circuits_on_QPU_devices.ipynb). \n", + "\n", + "### Table of Contents\n", + "\n", + "- Noise model for Rigetti\n", + " - Loading device calibration data\n", + " - Comparing noisy simulator results to QPU results\n", + " - Smaller noise models compared to QPU results" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e5e15fcd-55a2-4168-acc6-a38100f94511", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit, Gate\n", + "from braket.circuits.noise_model import GateCriteria, NoiseModel, ObservableCriteria\n", + "from braket.circuits.noises import (\n", + " BitFlip,\n", + " Depolarizing,\n", + " TwoQubitDepolarizing,\n", + ")\n", + "from braket.devices import Devices, LocalSimulator" + ] + }, + { + "cell_type": "markdown", + "id": "d4da3e37-e93c-4273-98bc-d67b26b8c822", + "metadata": {}, + "source": [ + "Braket provides access to hardware providers' reported calibration data. \n", + "This can be used to construct noise models to approximate the behavior of the QPU when running circuits on a noisy simulator.\n", + "In this tutorial, we focus on local noise models with no crosstalk interactions. Real devices can have crosstalk and unexpected effects that can further degrade the results.\n", + "\n", + "The Ankaa-2 calibration data is available on the Braket devices page. Under qubit specs, the calibration data include the qubit index, with corresponding values for the $T_1$, $T_2$, fidelity from randomized benchmarking (fRB), fidelity from simultaneous randomized benchmarking (fsRB), and readout fidelity (fRO).\n", + "Under \"edge specs\", the data includes the RB fidelity for two qubit gates for each connected edge in the device topology." + ] + }, + { + "cell_type": "markdown", + "id": "38001b96-faf7-49f0-b5a5-2d52820fcfc9", + "metadata": {}, + "source": [ + "**One-qubit calibration data (Qubit specs)**\n", + "
\n", + "\n", + "\n", + "**Two-qubit calibration data (Edge specs)**\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "276d680f-887d-4929-bcaa-e276a6303496", + "metadata": {}, + "source": [ + "We can programmatically access all the calibration data with the Braket SDK. First we load the AwsDevice using the ARN for Rigetti Ankaa-2." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a55ea9d5-05f3-4da5-a305-a391e914d012", + "metadata": {}, + "outputs": [], + "source": [ + "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66d8f3bf", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "a8a42ae1-51ac-4bf1-bd6a-81ffd982b5f8", + "metadata": {}, + "source": [ + "The properties dictionary contains one- and two-qubit calibration data. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "153b5b63-8205-4a7e-bb18-0305ef428f36", + "metadata": {}, + "outputs": [], + "source": [ + "one_qubit_data = rigetti.properties.standardized.oneQubitProperties\n", + "two_qubit_data = rigetti.properties.standardized.twoQubitProperties" + ] + }, + { + "cell_type": "markdown", + "id": "661cca17-01fa-40be-bd3e-741bacc74ce4", + "metadata": {}, + "source": [ + "For Ankaa-2, we can get all qubit indices with `one_qubit_data.keys()` or with `rigetti.topology_graph.nodes`.\n", + "\n", + "The keys of the two qubit dictionary are the connected qubit pairs separated by a hyphen. \n", + "For example, if qubit 0 and 1 are connected the key is \"0-1\".\n", + "\n", + "\n", + "#### One-qubit noise \n", + "\n", + "Let's look at the one qubit calibration data for qubit 0." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8d4ecc35-f4dc-49d8-b6ff-adaee560ac4b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OneQubitProperties(T1=CoherenceTime(value=8.645474408067754e-06, standardError=None, unit='S'), T2=CoherenceTime(value=1.2710111632672265e-05, standardError=None, unit='S'), oneQubitFidelity=[Fidelity1Q(fidelityType=FidelityType(name='RANDOMIZED_BENCHMARKING', description=None), fidelity=0.998913376867117, standardError=2.7016428586132974e-05), Fidelity1Q(fidelityType=FidelityType(name='SIMULTANEOUS_RANDOMIZED_BENCHMARKING', description=None), fidelity=0.9975435377199546, standardError=0.00015343141167926104), Fidelity1Q(fidelityType=FidelityType(name='READOUT', description=None), fidelity=0.9219999999999999, standardError=None)])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "one_qubit_data[\"0\"]" + ] + }, + { + "cell_type": "markdown", + "id": "4b676762-e642-4a98-89e3-86d79367071a", + "metadata": {}, + "source": [ + "For each qubit, there are various metrics of the quality:\n", + "\n", + "- **T1**: Thermal relaxation time is related to the time it takes for the excited state, |1⟩, to decay into the ground state, |0⟩. The probability of remaining in the excited state is $p(|1⟩)\\sim e^{-t/T_1}$\n", + "\n", + "- **T2**: The dephasing time, is the decay constant for the scale for a |+⟩ state to decohere into the completely mixed state. $p(|+⟩)\\sim e^{-t/T_2}$ \n", + "\n", + "- **Fidelity (RB)**: Single-qubit randomized benchmarking fidelities. RB fidelity quantifies the average gate fidelity where the average is over all Clifford gates. RB describes an *effective* noise model with gate-independent depolarizing noise on each Clifford gate.\n", + "\n", + "- **Fidelity (sRB)**: Single-qubit simultaneous randomized benchmarking fidelities. These are extracted by running single-qubit RB on all qubits simultaneously. Note that we expect the sRB fidelity to be lower than standard RB fidelity due to non-local crosstalk type noise on the device. \n", + "\n", + "- **Readout fidelity**: Single-qubit readout fidelities describes the probability of a bit flip error before readout in the computational basis. The readout fidelity is related to the probability of correctly measuring the ground state and excited states respectively, e.g. $f_{RO} =\\frac{p(0|0)+p(1|1)}{2}$" + ] + }, + { + "cell_type": "markdown", + "id": "296708a3-771e-42b4-9ba8-f3db1a02970b", + "metadata": {}, + "source": [ + "Now that we know how to extract and use the calibration data, we can build a simple noise model. For every qubit we will add:\n", + "- amplitude dampening noise with probability $p= 1-e^{-t/T_1}$ for every gate\n", + "- phase dampening noise with probability $p= 0.5(1-e^{-t/T_2})$ for every gate\n", + "- depolarizing noise with probability $p=1-f_{sRB}$ (from simultaneous RB fidelity) for every gate\n", + "- readout bit flip noise with probability $p=1-f_{RO}$ to measurements \n", + "\n", + "Technically, the sRB fidelity already includes effects from $T_1$/$T_2$, however to be explicit we add these as separate terms. In a sense, this model might overestimate the noise on the QPU. " + ] + }, + { + "cell_type": "markdown", + "id": "5769f2f4-de1c-4b47-9e4e-fd8d39b9e975", + "metadata": {}, + "source": [ + "To create the noise model, we iterate over all qubits keys in `one_qubit_data`" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7442cd27", + "metadata": {}, + "outputs": [], + "source": [ + "noise_model = NoiseModel()\n", + "\n", + "# Readout Noise Model\n", + "for q, data in rigetti.properties.standardized.oneQubitProperties.items():\n", + " try:\n", + " readout_error = 1 - data.oneQubitFidelity[2].fidelity # readout\n", + " noise_model.add_noise(BitFlip(readout_error), ObservableCriteria(qubits=int(q)))\n", + "\n", + " depolarizing_rate = (\n", + " 1 - data.oneQubitFidelity[1].fidelity\n", + " ) # SIMULTANEOUS_RANDOMIZED_BENCHMARKING\n", + " noise_model.add_noise(Depolarizing(probability=depolarizing_rate), GateCriteria(qubits=q))\n", + " except:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9d20d24c-17e2-4bba-b317-fb2d156bedb0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of terms in noise model is: 167\n", + "Number of parameters in noise model is: 167\n" + ] + } + ], + "source": [ + "num_params = sum(len(item.noise.parameters) for item in noise_model.instructions)\n", + "print(f\"Number of terms in noise model is: {len(noise_model.instructions)}\")\n", + "print(f\"Number of parameters in noise model is: {num_params}\")" + ] + }, + { + "cell_type": "markdown", + "id": "790c62f7-776a-4e4c-9405-7b7a14eee5b0", + "metadata": {}, + "source": [ + "#### Two-qubit noise \n", + "Next we consider adding two-qubit noise to the model. \n", + "\n", + "Let's first look at the data provided in the Ankaa-2 device calibration data. On the first connect, \"0-1\", the properties are:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "626cbe56-3649-48eb-a2a1-f669eb790b47", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "TwoQubitProperties(twoQubitGateFidelity=[GateFidelity2Q(direction=None, gateName='ISWAP', fidelity=0.9773180863130815, standardError=0.00408287380553746, fidelityType=FidelityType(name='INTERLEAVED_RANDOMIZED_BENCHMARKING', description=None))])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "two_qubit_data[\"0-1\"]" + ] + }, + { + "cell_type": "markdown", + "id": "4bcd3be4-a6e4-4cf3-841e-1a451e01803a", + "metadata": {}, + "source": [ + "Here, we see the fidelity per gate (ISWAP or CZ) and the associated standard error. \n", + "\n", + "Next we loop over the entries in the `two_qubit_data` dictionary and add two-qubit depolarizing noise to the model. Notice that Ankaa-2 has symmetric connections (\"0-1\" and \"1-0\") so we need to add noise in both directions." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "80f57550-6549-46b6-9a6d-ff7f0f03e90d", + "metadata": {}, + "outputs": [], + "source": [ + "# Two-qubit noise\n", + "for pair, data in two_qubit_data.items(): # iterate over qubit connections\n", + " # parse strings \"0-1\" to integers [0, 1]\n", + " q0, q1 = (int(s) for s in pair.split(\"-\"))\n", + " try:\n", + " if data.twoQubitGateFidelity[0].gateName == \"ISWAP\":\n", + " phase_rate = 1 - data.twoQubitGateFidelity[0].fidelity\n", + " noise_model.add_noise(\n", + " TwoQubitDepolarizing(phase_rate),\n", + " GateCriteria(Gate.ISwap, [(q0, q1), (q1, q0)]), # symmetric connections\n", + " )\n", + " except:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "82376d08-84bc-4249-9c8d-d7aacdb73113", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of terms in noise model is: 274\n", + "Number of parameters in noise model is: 274\n" + ] + } + ], + "source": [ + "num_params = sum(len(item.noise.parameters) for item in noise_model.instructions)\n", + "print(f\"Number of terms in noise model is: {len(noise_model.instructions)}\")\n", + "print(f\"Number of parameters in noise model is: {num_params}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5913a8a2-a9de-4e32-a35d-c48191891b1f", + "metadata": {}, + "source": [ + "### Compare circuits run on device vs simulator with a noise model\n", + "\n", + "Let's just look at the first 5 qubits. Note that to ensure the noise model applied T1 and T2 noise during the time between gate, we manually add identity gates to each moment." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6fabbd05-b480-43c6-b43a-d396d81bd687", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │\n", + " ┌──────────┐ ┌──────────┐ ┌───────┐ \n", + "q0 : ─┤ Rx(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─\n", + " └──────────┘ └──────────┘ └───┬───┘ \n", + " ┌──────────┐ ┌──────────┐ ┌───┴───┐ \n", + "q1 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─\n", + " └──────────┘ └──────────┘ └───────┘ \n", + " ┌──────────┐ ┌──────────┐ \n", + "q2 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├───────────\n", + " └──────────┘ └──────────┘ \n", + "T : │ 0 │ 1 │ 2 │\n" + ] + } + ], + "source": [ + "np.random.seed(42)\n", + "\n", + "circ = Circuit().rx(0, 0.5).rz(1, 0.5).rz(2, 0.5).rx(0, np.pi).rx(1, np.pi).rx(2, np.pi).iswap(0, 1)\n", + "print(circ)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e2af07ed-33de-4709-9e7c-5e3c3caaa751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │\n", + " ┌──────────┐ ┌──────────┐ ┌───────┐ ┌─────────────┐ \n", + "q0 : ─┤ Rx(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─┤ DEPO(0.023) ├─\n", + " └──────────┘ └──────────┘ └───┬───┘ └──────┬──────┘ \n", + " ┌──────────┐ ┌──────────┐ ┌───┴───┐ ┌──────┴──────┐ \n", + "q1 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├─┤ ISWAP ├─┤ DEPO(0.023) ├─\n", + " └──────────┘ └──────────┘ └───────┘ └─────────────┘ \n", + " ┌──────────┐ ┌──────────┐ \n", + "q2 : ─┤ Rz(0.50) ├─┤ Rx(3.14) ├───────────────────────────\n", + " └──────────┘ └──────────┘ \n", + "T : │ 0 │ 1 │ 2 │\n" + ] + } + ], + "source": [ + "noisy_circ = noise_model.apply(circ)\n", + "\n", + "print(noisy_circ)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9304dcf1-a1e8-4e41-a6b5-769841f4eefe", + "metadata": {}, + "outputs": [], + "source": [ + "simulator = LocalSimulator() # noise free simulator\n", + "task = simulator.run(circ, shots=10_000)\n", + "free_probs = task.result().measurement_probabilities" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0e1d9cfe-03d6-406b-b4ab-89166a907681", + "metadata": {}, + "outputs": [], + "source": [ + "noisy_simulator = LocalSimulator(\"braket_dm\")\n", + "noisy_task = noisy_simulator.run(noisy_circ, shots=10_000)\n", + "noisy_probs = noisy_task.result().measurement_probabilities" + ] + }, + { + "cell_type": "markdown", + "id": "b3f370bd-a8b3-4d5b-a724-da549fc4c81f", + "metadata": {}, + "source": [ + "
\n", + "Note: The below section runs tasks on the Rigetti Ankaa-2 device. When you run this notebook, make sure the device is currently available. You can find QPU availability windows on the Devices page in the Amazon Braket Console.\n", + "
\n", + "\n", + "
\n", + "Note: Running the circuit below will result in charges on your AWS account.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c8f4664a-0527-46fb-87f2-2a0c85f0bd79", + "metadata": {}, + "outputs": [], + "source": [ + "rigetti_task = rigetti.run(circ, shots=10_000, disable_qubit_rewiring=True)\n", + "rigetti_result = rigetti_task.result()\n", + "rigetti_probs = rigetti_result.measurement_probabilities" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "1676a45c-5ef8-49cc-b227-69f69fa2004a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Ankaa-2noisy_simfree_sim
1100.1866NaNNaN
0110.09960.0061NaN
0010.05280.0055NaN
1110.45550.92140.9384
1010.12540.06700.0616
0100.0229NaNNaN
1000.0443NaNNaN
0000.0129NaNNaN
\n", + "
" + ], + "text/plain": [ + " Ankaa-2 noisy_sim free_sim\n", + "110 0.1866 NaN NaN\n", + "011 0.0996 0.0061 NaN\n", + "001 0.0528 0.0055 NaN\n", + "111 0.4555 0.9214 0.9384\n", + "101 0.1254 0.0670 0.0616\n", + "010 0.0229 NaN NaN\n", + "100 0.0443 NaN NaN\n", + "000 0.0129 NaN NaN" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "free_sim = pd.DataFrame.from_dict(free_probs, orient=\"index\").rename(columns={0: \"free_sim\"})\n", + "noisy_sim = pd.DataFrame.from_dict(noisy_probs, orient=\"index\").rename(columns={0: \"noisy_sim\"})\n", + "Ankaa = pd.DataFrame.from_dict(rigetti_probs, orient=\"index\").rename(columns={0: \"Ankaa-2\"})\n", + "df = Ankaa.join(noisy_sim).join(free_sim)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "472e6850-2603-4174-bf92-b04eb0c38c2f", + "metadata": {}, + "source": [ + "We can compute the fidelity between the free simulation and Rigetti, as well as the noisy simulation and Rigetti. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "5b7d1740-cb46-433e-8c2b-7e8b7c10fb4e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Total fidelity between Ankaa-2 and noise-free simulator is 0.7416798056649024\n", + "\n", + "Total fidelity between Ankaa-2 and noisy simulator is 0.7811919904651835\n" + ] + } + ], + "source": [ + "def fidelity(p, q):\n", + " return np.sum(np.sqrt(p * q))\n", + "\n", + "\n", + "f_free_Ankaa = fidelity(df[\"free_sim\"], df[\"Ankaa-2\"])\n", + "f_noisy_Ankaa = fidelity(df[\"noisy_sim\"], df[\"Ankaa-2\"])\n", + "\n", + "print(f\"\\nTotal fidelity between Ankaa-2 and noise-free simulator is {f_free_Ankaa}\")\n", + "print(f\"\\nTotal fidelity between Ankaa-2 and noisy simulator is {f_noisy_Ankaa}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fd4d88b7-015e-445b-ba26-1bdbc6a2bd16", + "metadata": {}, + "source": [ + "To better visualize, we can also plot the output probability distributions from each circuit:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9329ed72-2f30-4383-b48f-0d50e1a5dd11", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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/f31zjvv3PeYdbfp06cre/bsatCggV566SVNnz49RZ3k48SIESM0YcIE6/+Bzz33nP7888/7LmPHjh3y8/NTzZo1deXKFUlp/79rypQpql27tvz9/eXq6qoSJUro66+/TtO65cqVyyZQJ3vxxRclKcUxAUDG40w18B+wYMECFSpUSFWqVElT/U6dOmnq1Kl66aWX9O6772rTpk0aOnSo9uzZo59//tmm7sGDB9W6dWu98cYbeu211zRixAg1atRI48eP1/vvv69u3bpJkoYOHaoWLVpo3759Nmcvb926pXr16qlSpUoaPny4lixZosjISCUmJmrQoEHWemPGjFHjxo316quvKiEhQTNnztTLL7+shQsXqkGDBjZ9WrFihX788Uf16NFDuXLluu/APy1atFDBggU1dOhQbdu2Td9++638/f01bNgwa5127drpxx9/VJs2bVSpUiWtXr06xXLv59NPP5WTk5N69+6t2NhYDR8+XK+++qo2bdpkrRMdHa327dvrueee09ChQxUTE6MxY8Zo3bp12r59u3x9fe22vXv3bjVs2FBlypTRoEGD5OrqqoMHD9qE16SkJDVu3Fhr167V66+/ruLFi2vnzp36/PPPtX///nvej1m8eHF99913euedd5QvXz69++67kiQ/Pz9rWBg8eLBcXFzUu3dvxcfHy8XFRStWrFD9+vUVEhKiyMhIOTk5Wb88/vHHH6pQoYIkKSYmRpUqVbIGNz8/Py1evFgdO3ZUXFzcPQdES8u6p+bWrVuqX7++atSooeHDh2v69Onq0aOHPD099cEHH+jVV19Vs2bNNH78eLVt21aVK1dWwYIF79vu/cTFxenbb79Vq1at1LlzZ12+fFmTJk1SeHi4Nm/erLJly8rPz09ff/21unbtqhdffFHNmjWTJJUpU0aS9Pvvv6t+/foqVKiQoqKidP36dY0dO1ZVq1bVtm3bUrzvX375ZRUpUkRDhgxJ8aNVWq1du1Zz585Vt27dlC1bNn3xxRdq3ry5jh8/rpw5c0q6vT+qV68ub29v9enTR1mzZtU333yjmjVravXq1anez5qQkKDw8HDFx8erZ8+eCgwM1MmTJ7Vw4UJdunRJPj4+atOmjTp37qxdu3apVKlS1nn//PNP7d+/Xx9++GGqfT9z5ozq1q0rPz8/9evXT76+vjp69Kjmzp2bpnVv2bKlihcvrk8//VSLFi3Sxx9/rBw5cuibb75R7dq1NWzYME2fPl29e/fWc889pxo1aqRjy6YuLce+7777Tp06dVKFChX0+uuvS5IKFy4sKf37o1u3bvLz89OAAQN09erVdPc3OjpaXl5e6tWrl7y8vLRixQoNGDBAcXFx+uyzz2zqXrx4UfXq1VOzZs3UokULzZkzR3379lXp0qVVv359Sbd/0KxTp46OHz+uN998U3ny5NF3332nFStWpKtf06dPV7NmzeTi4qJWrVrp66+/1p9//qnnnnsuRd0ZM2bo8uXLeuONN2SxWDR8+HA1a9ZMhw8fTvUWkj///FPh4eEqX768fvnlF7m7u0tK+/9dX3/9tUqWLKnGjRsrS5YsWrBggbp166akpCR17949Xeua7PTp05Juh24AD5kBIFOLjY01JBlNmjRJU/0dO3YYkoxOnTrZlPfu3duQZKxYscJaFhQUZEgy1q9fby1bunSpIclwd3c3jh07Zi3/5ptvDEnGypUrrWURERGGJKNnz57WsqSkJKNBgwaGi4uLcfbsWWv5tWvXbPqTkJBglCpVyqhdu7ZNuSTDycnJ2L17d4p1k2RERkZa/46MjDQkGR06dLCp9+KLLxo5c+a0/r1161ZDkvH222/b1GvXrl2KNu1ZuXKlIckoXry4ER8fby0fM2aMIcnYuXOndZ38/f2NUqVKGdevX7fWW7hwoSHJGDBgQIq+J/v8888NSTbb7G7fffed4eTkZPzxxx825ePHjzckGevWrbvnehjG7X3eoEEDu+tXqFAhm/2UlJRkFClSxAgPDzeSkpKs5deuXTMKFixoPP/889ayjh07Grlz5zbOnTtn0/Yrr7xi+Pj4pNj/d0rLuh85csSQZEyZMsValvz+GzJkiLXs4sWLhru7u2GxWIyZM2day/fu3Zvq++duU6ZMMSQZR44csZaFhoYaoaGh1r8TExNt3gvJyw4ICLB5P549ezbV91jZsmUNf39/4/z589ayv/76y3BycjLatm2bop+tWrWyu23SSpLh4uJiHDx40GZ5koyxY8day5o2bWq4uLgYhw4dspadOnXKyJYtm1GjRg1rWfL7JvmYsH37dkOSMXv27FT7cOnSJcPNzc3o27evTfmbb75peHp6GleuXEl13p9//tmQZPz555/3XU97+/n111+3liUmJhr58uUzLBaL8emn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M4Fp1bRpUwUHB2vgwIEKCgqyDsJ1dzCfPXu2li1bpoYNG6pbt26Ki4uTJMXHx6tevXpatWqVypYtq44dO+rmzZtatGiRmjRporFjx9qcTUxv/fRKDtBt27bVc889p0KFCunHH3/UmDFj5OXlZXee+fPna9GiRWrUqJGqVKmiNWvWaNq0aTp06NB9Q+Lly5fVtGlTrVy5UiNHjlSvXr0kSRcuXNDbb7+t6tWr64UXXlD27Nl1+PBhzZ8/X4sXL9aaNWv03HPPWdvZs2ePBgwYoFq1aunFF1+Up6en9u7dqxkzZmjRokXatm2bgoKCTG+XjLBq1SpJUt26dVNMCw8PV3R0tFavXm36iofo6GjdunVLbdu2VdasWe3Wef/993X8+HEtXLhQFovF1HKS286Shf+iAADA449vLMBDVLNmTdWsWVPR0dGSlOoltffStGlTNW3aVAMHDlRwcHCqbSxZskRLly5VWFiYTfmgQYO0atUqffTRRxo4cKA16Fy+fFm1a9fWu+++q2bNmilPnjym6qfH+fPn9csvv6hYsWLWwPraa69p0KBBmjVrlvXM9d0WLFigVatWWe8HvnXrlsLCwrRq1Spt3LhRlSpVsjtfTEyM6tevr127dmnatGl67bXXrNOyZ8+u48ePK2/evDbz7N69W5UqVdL777+v3377zVpevHhx/fvvv8qRI4dN/ZUrVyosLEwff/yxJk6cmKbtMHr0aF26dClNdaXb74GyZcvet96BAwfk5eVldwC7IkWKWOuYYRiGJk+eLCn1S7/XrFmjMWPGaNSoUSpcuLCp5Rw/fly///67cufOrdKlS5tqAwAA4FEiVAOZRJMmTVIE6qSkJH399dcqXLiwTUCWpGzZsmnAgAFq3Lix5s6dqx49eqS7fnp99913SkhIUJs2baxlbdu21aBBgzRp0qRUQ3Xr1q1tBthydnZWRESEVq1apT///NNuqD506JDCw8P177//av78+apXr57NdFdX1xSBWpJKliypWrVqaenSpbp586b1rOmdl1PfqVatWipZsqR+//33+2+A/2/06NE6duxYmusHBwenKVTHxsbK39/f7jRvb29rHTNWr16tQ4cOqVq1anr66adTTL969arat2+vypUrq2fPnqaWcfPmTbVp00bx8fEaNmzYfUcYBwAAeBwQqoFMokKFCinK9u3bp4sXLypPnjwaOHBgiulnz56VJO3du9dU/fSaNGmSLBaLzRnjwoULq0qVKlq/fr327Nmj4sWLp5gvJCQkRVm+fPkkye4Z371796pq1apKTEzUihUrVLFiRbv92bFjh4YPH661a9fq9OnTunnzps30c+fOKXfu3Na/V61apdGjR2vTpk06d+6cEhMTrdPSMwjd0aNH01z3cZF82X5qP3z07t3bes/1/QZCsycpKUnt2rXTmjVr1LlzZ5sfXgAAAB5nhGogkwgICEhRduHCBUm3L2nevXt3qvNevXrVVP302LRpk3bt2qVatWqpQIECNtPatm2r9evXa/LkyXafW518lvVOyffb3rp1K8W0/fv36+LFi6pSpYpKlSpltz/r169X7dq1Jd2+B7lIkSLy8vKSxWLRvHnz9Ndffyk+Pt5af/bs2WrZsqW8vLwUHh6u4OBgeXh4WAdSS8+Z54fFx8cn1TPRyffYp3bG/V5iY2P1008/ydvbWy1atEgxfdWqVRo/frw+++wzFS1aNN3tJyUlqUOHDpoxY4Zee+01jR8/Pt1tAAAAOAqhGsgk7A0KlRxGmzdvrjlz5ty3jfTWT4/kM50rV65MdQCradOmaciQIakOgpVWjRs3VsGCBRUVFaUXXnhBv/76qzw9PW3qfPLJJ4qPj9cff/yhatWq2UzbuHGj/vrrL5uyqKgoubm5aevWrdb7k5PNnDkzXf17WPdUFylSRBs2bNDp06dT3FedfC/13X1Pi+nTp+v69etq27atPDw8UkzfsWOHJOm9996z+8zxffv2yWKxyMfHJ8V6JyUlqX379po2bZpatWql6OhoU2e6AQAAHIVQDWRixYsXl7e3t7Zs2WJzf3BG1U+rq1evaubMmfLw8FCrVq3s1vnzzz/1999/a+HChXrxxRcfeJmRkZFydnbWRx99pPr16+vXX3+1GV380KFDypEjR4pAfe3aNW3bti1Fe4cOHVLJkiVThNJ///1Xhw8fTlffHtY91aGhodqwYYOWLVumtm3b2kxbunSptU56Jf8gktoAZaVKlUr1svBJkybJx8dHL730UopAfmegbtmypb777jvuowYAAE8cQjWQiWXJkkVdu3bVsGHD1Lt3b40YMSJFUN61a5f8/f3l7++f7vppNXv2bF2+fFlt27bVt99+a7fOsmXLFB4erkmTJmVIqJakDz/8UE5OTvrggw9U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KQK1JD399NP64osvVLNmzUffMZgSHx+vrl27qnTp0nanHzt2TAMHDnzEvYJZpUqVUsWKFdW1a1e703fs2MEXgSeMr6+vLBZLqtMNw7jndDxe+CEzc2nYsKFef/11TZo0SeXKlbOZtn37dnXt2lWNGjVyUO9gBj+UZB41a9ZU7969NX36dOXKlctm2rlz59S3b18yiwjVDuPq6nrPMyeXL1+Wq6vrI+wRHkTZsmWVP39+RURE2J3+119/EaqfIFWrVtW+fftSnZ4tWzbu1XzCZMuWTR988IEqVqxod/qBAwf0xhtvPOJewSx+yMxcxo0bp9atWyskJETZs2e33vp25swZXbp0SeHh4Ro3bpyDe4n04IeSzGP8+PF64YUXlDt3bpUuXdrmltWdO3eqRIkSWrhwoYN76XiEagdp2bKlIiIi9Pnnn6tOnTry9vaWdPsSxeXLl6tXr15q1aqVg3uJtGrQoIEuXbqU6vQcOXIwANITZMyYMfecXrhwYa1cufIR9QYZIfk++dDQULvTfX19xRAjTw5+yMxcsmfPrsWLF2vv3r12B28tVqyYg3uI9OKHkswjf/78+uuvv7R06VJt3LjR+vmsUKGChgwZorp16/7nR/6WGKjMYeLj4/X2229r8uTJSkxMtF4ik5CQoCxZsqhjx476/PPPOVsNABlg4sSJun79ut58802702NiYjR+/HhFRkY+4p7BjCFDhujmzZup7q8TJ05owIABmjJlyiPuGYA77dmzxyaI8UMJMitCtYPFxcVp69atNgebkJAQ65lrAI7DI+8AwPF45B3gePa+E1WpUkXPPfecg3v2eCBUA48AXwieLDzyDgAeHzwi7cmUkJCgefPm2Q1iTZo0uedAZnh88J0obQjVj6mYmBh98803GjBggKO7ggzAF4Iny0svvaRTp05pypQpqT7yLk+ePDzyLhPhmPvk4Qt75nG/R979/fffCg0N5f/QJ8jBgwcVHh6uU6dOqWLFijZBbNOmTcqXL58WL16sp556ysE9xf3wnShtCNWPKULYk4UvBJlLtmzZtGbNmhQjlibbunWratasybONMxGOuU8WvrBnLk5OTml65B2fzyfH888/L09PT02bNi3FLY1xcXFq27atrl+/rqVLlzqoh0grvhOlDaN/O8jff/99z+n3epwPHj88Azdz4ZF3mQ/H3Mwl+XFa27dvT/ULe/fu3fnC/oTgkXeZz7p167R582a7YwR5e3tr8ODBqe5vPF74TpQ2hGoHKVu2rCwWi91HuCSXE8KeHHwhyFx45F3mwzE3c+ELe+bCI+8yH19fXx09elSlSpWyO/3o0aPy9fV9tJ2CKXwnShtCtYPkyJFDw4cPV506dexO3717txo1avSIewWz+EKQuYwaNUpJSUl65ZVXUn3k3YgRIxzcS6QHx9zMhS/smUvr1q117dq1VKcHBgbyuLsnTKdOndS2bVt99NFHqlOnjs0tGsuXL9fHH3+snj17OriXSAu+E6UNodpBQkJCdOrUKQUFBdmdfunSJULYE4QvBJmLq6urvv76aw0bNoxH3mUSHHMzF76wZy6dO3e+5/SAgAD+D33CDBo0SJ6envrss8/07rvvWq8EMgxDgYGB6tu3r/r06ePgXiIt+E6UNgxU5iA///yzrl69qtdee83u9IsXL2r+/PmKiIh4xD0DIEnnzp3T5MmT7Y4s3K5dO/n5+Tm4h0gPjrmZz7BhwzRmzBidPn06xRf2t99+my/sTxiOuZnXkSNHbPZpwYIFHdwjpBefz/sjVAMZhANO5vHnn38qPDxcHh4eCgsLS3EW7Nq1a1q6dKnKly/v4J4C4Av7k49j7n/PiRMnFBkZqcmTJzu6K7gPPp9pQ6h+THGwebJwwMlcKlWqpGeeeUbjx49PMXiVYRjq0qWL/v77b23YsMFBPURG45ibubA/nywcc/97eIzhk4PPZ9oQqh9THGyeLBxwMhd3d3dt375dxYoVszt97969KleunK5fv/6Ie4aHhWNu5sL+fLJwzM185s+ff8/phw8f1rvvvstn9AnA5zNtGKjMQdJysMGT46+//lJ0dLTdR/JYLBa98847KleunAN6BjMCAwO1efPmVP8D2bx5s/VqBDwZOOZmLuzPzIVjbubTtGnTVB9jmIzHGD4Z+HymDaHaQTjYZC4ccDKX3r176/XXX9fWrVvtjiw8ceJEHh/xhOGYm7mwPzMXjrmZT+7cufXVV1+pSZMmdqfv2LFDISEhj7hXMIPPZ9oQqh2Eg03mwgEnc+nevbty5cqlzz//XF999ZX18jRnZ2eFhIQoOjpaLVq0cHAvkR4cczMX9mfmwjE38wkJCdHWrVtT/Yze70cxPD74fKYN91Q7SOPGjVW2bFkNGjTI7vS//vpL5cqVU1JS0iPuGcyaNWuWPv/8c23dujXFAadXr14ccJ5QN2/e1Llz5yRJuXLlUtasWR3cI5jBMTdzYX9mXhxzM4c//vhDV69eVb169exOv3r1qrZs2aLQ0NBH3DM8CD6fqSNUOwgHm8yLAw7w+OGYm7mwPwEAjxNCNQAAAAAAJjk5ugMAAAAAADypCNUAAAAAAJhEqAYAAAAAwCRCNQAAAAAAJhGqAQAAAAAwiVANAAAAAIBJhGoAAAAAAEz6fzSHt11n6r/FAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "\n", + "df.plot.bar(\n", + " title=\"Comparing noise-free simulator, noisy simulator, and Ankaa-2\",\n", + " figsize=(12, 6),\n", + ")\n", + "\n", + "text = f\"f_free_Ankaa = {f_free_Ankaa:.3f} \\nf_noise_model_Ankaa = {f_noisy_Ankaa:.3f}\"\n", + "plt.text(1, 0.5, text, fontsize=14)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "aa8ffab8-e062-4c33-9c9d-4a312cd76b63", + "metadata": {}, + "source": [ + "We confirm that the simulator with a noise model is closer to the distribution produced by Ankaa-2." + ] + }, + { + "cell_type": "markdown", + "id": "c4571a5e-2f8d-4767-b28e-a527d2490830", + "metadata": {}, + "source": [ + "### Smaller, reduced noise models\n", + "\n", + "The full Rigetti Ankaa-2 noise model contains due to non-uniform qubit noise. We can obtain simpler, smaller noise models by coarse graining the model above.\n", + "\n", + "Here, we consider taking the average over all qubits for the $T_1$, $T_2$, depolarizing, and readout depolarizing rates. This is a substantially smaller noise model, but may be less accurate. \n", + "\n", + "We use the `from_filter` function to extract all instructions with amplitude dampening noise in the model. We then compute the mean of the error probabilities. " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "eac8479f-4b29-42d8-a15a-ba10aae82d3f", + "metadata": {}, + "outputs": [], + "source": [ + "avg_depo = np.mean(\n", + " [n.noise.parameters for n in noise_model.from_filter(noise=Depolarizing).instructions]\n", + ")\n", + "avg_readout = np.mean(\n", + " [n.noise.parameters for n in noise_model.from_filter(noise=BitFlip).instructions]\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d1a64cae-226c-45d2-9af3-4b5b7a36c7a4", + "metadata": {}, + "source": [ + "Now we construct a new noise model with the mean values above:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e49eb24c-5f24-4084-9d4c-c2e7e82fc259", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gate Noise:\n", + " Depolarizing(0.010099107504894678), GateCriteria(None, None)\n", + "Readout Noise:\n", + " BitFlip(0.06397619047619048), ObservableCriteria(None, None)\n" + ] + } + ], + "source": [ + "simple_noise_model = NoiseModel()\n", + "simple_noise_model.add_noise(Depolarizing(avg_depo), GateCriteria())\n", + "simple_noise_model.add_noise(BitFlip(avg_readout), ObservableCriteria())\n", + "\n", + "print(simple_noise_model)" + ] + }, + { + "cell_type": "markdown", + "id": "b44bbbd1-fb65-4b8f-8dfa-0ea5aa7979b2", + "metadata": {}, + "source": [ + "We can see the resultant circuits contain qubit-independent noise:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c83e96f6-54b0-445b-bcdd-8a7a16691b62", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │\n", + " ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ ┌───────┐ ┌────────────┐ \n", + "q0 : ─┤ Rx(0.50) ├─┤ DEPO(0.01) ├─┤ Rx(3.14) ├─┤ DEPO(0.01) ├─┤ ISWAP ├─┤ DEPO(0.01) ├─\n", + " └──────────┘ └────────────┘ └──────────┘ └────────────┘ └───┬───┘ └────────────┘ \n", + " ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ ┌───┴───┐ ┌────────────┐ \n", + "q1 : ─┤ Rz(0.50) ├─┤ DEPO(0.01) ├─┤ Rx(3.14) ├─┤ DEPO(0.01) ├─┤ ISWAP ├─┤ DEPO(0.01) ├─\n", + " └──────────┘ └────────────┘ └──────────┘ └────────────┘ └───────┘ └────────────┘ \n", + " ┌──────────┐ ┌────────────┐ ┌──────────┐ ┌────────────┐ \n", + "q2 : ─┤ Rz(0.50) ├─┤ DEPO(0.01) ├─┤ Rx(3.14) ├─┤ DEPO(0.01) ├──────────────────────────\n", + " └──────────┘ └────────────┘ └──────────┘ └────────────┘ \n", + "T : │ 0 │ 1 │ 2 │\n" + ] + } + ], + "source": [ + "simple_noisy_circ = simple_noise_model.apply(circ)\n", + "print(simple_noisy_circ)" + ] + }, + { + "cell_type": "markdown", + "id": "e2c20b79-cbf2-4897-80b3-452c78d56a03", + "metadata": {}, + "source": [ + "We run the circuit on a noisy simulator below" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "a1bb19e8-6824-4a50-b9fb-ae06c14359b6", + "metadata": {}, + "outputs": [], + "source": [ + "simple_noisy_task = noisy_simulator.run(simple_noisy_circ, shots=100_000)\n", + "simple_noisy_probs = simple_noisy_task.result().measurement_probabilities" + ] + }, + { + "cell_type": "markdown", + "id": "76418e5c-be5b-4b3a-8916-c0f56f003cd7", + "metadata": {}, + "source": [ + "and add it to the previous dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "b4d27a95-612d-4dea-9f6a-98d4525b0a70", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Ankaa-2noisy_simfree_simsimple_noisy_sim
1100.1866NaNNaN0.01230
0110.09960.0061NaN0.01795
0010.05280.0055NaN0.00156
1110.45550.92140.93840.89030
1010.12540.06700.06160.07659
0100.0229NaNNaN0.00019
1000.0443NaNNaN0.00108
0000.0129NaNNaN0.00003
\n", + "
" + ], + "text/plain": [ + " Ankaa-2 noisy_sim free_sim simple_noisy_sim\n", + "110 0.1866 NaN NaN 0.01230\n", + "011 0.0996 0.0061 NaN 0.01795\n", + "001 0.0528 0.0055 NaN 0.00156\n", + "111 0.4555 0.9214 0.9384 0.89030\n", + "101 0.1254 0.0670 0.0616 0.07659\n", + "010 0.0229 NaN NaN 0.00019\n", + "100 0.0443 NaN NaN 0.00108\n", + "000 0.0129 NaN NaN 0.00003" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simple_noisy_sim = pd.DataFrame.from_dict(simple_noisy_probs, orient=\"index\").rename(\n", + " columns={0: \"simple_noisy_sim\"}\n", + ")\n", + "df = df.join(simple_noisy_sim)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "b1699bc2-712f-4a99-b9d6-0a0920114a13", + "metadata": {}, + "source": [ + "We compute the fidelity between the simple noise model and the QPU:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "d7710e0b-29ac-4968-aa00-e23cb8b32269", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Total fidelity between Ankaa-2 and full noise model is: 0.7811919904651835\n", + "\n", + "Total fidelity between Ankaa-2 and simple noise model is: 0.8437069124308016\n", + "\n", + "Total fidelity between Ankaa-2 and noise-free is: 0.7416798056649024\n" + ] + } + ], + "source": [ + "f_simple = fidelity(df[\"simple_noisy_sim\"], df[\"Ankaa-2\"])\n", + "\n", + "print(f\"\\nTotal fidelity between Ankaa-2 and full noise model is: {f_noisy_Ankaa}\")\n", + "print(f\"\\nTotal fidelity between Ankaa-2 and simple noise model is: {f_simple}\")\n", + "print(f\"\\nTotal fidelity between Ankaa-2 and noise-free is: {f_free_Ankaa}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "e36e19d0-664a-4cb4-a2e3-0061cd60a6c1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9UAAAIcCAYAAAD42o3XAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB7xUlEQVR4nO3dd3xO5//H8fedyF5GCCESI7W3UrREpaJ21ShKzNq0qlSHWbP4Wi2tmi2lVdSoVRVtUbNqa42gRYySECPI+f3hl7vuZh8ho6/n45FH5ZzrnPM55+S+e7/vc53rWAzDMAQAAAAAAFLNLr0LAAAAAAAgsyJUAwAAAABgEqEaAAAAAACTCNUAAAAAAJhEqAYAAAAAwCRCNQAAAAAAJhGqAQAAAAAwiVANAAAAAIBJhGoAAAAAAEwiVAMAMjyLxaJhw4aldxkJmjdvniwWi8LDw9Nl+xn52GRkYWFhslgsCgsLS5ftd+jQQe7u7umybQBA2iJUA0AmcOLECXXr1k2FCxeWs7OzPD09VaNGDU2ZMkW3bt1K7/KQCR0+fFjDhg1Lty8DMqOPP/5YFotFVatWTe9S0tTNmzf10UcfqW7dusqXL588PDxUoUIFzZgxQ/fv30/v8gAgw8uW3gUAAJK2Zs0atWjRQk5OTmrfvr1Kly6tmJgY/fzzz3rrrbd06NAhffrpp+ld5mN169YtZcuWMf+X1a5dO73yyitycnJK71JS5fDhwxo+fLiCgoIUEBCQ3uVkCgsXLlRAQIB27typ48ePq2jRouldUpo4efKk+vTpozp16qh///7y9PTU+vXr1bNnT/3yyy+aP39+epcIABlaxvyEAgCQJJ06dUqvvPKK/P399cMPPyhfvnzWeb169dLx48e1Zs2adKzw8YmNjVVMTIycnZ3l7Oyc3uUkyt7eXvb29uldRoZx8+ZNubq6pncZae7UqVPatm2bli1bpm7dumnhwoUaOnRoepeVJvLmzasDBw6oVKlS1mndunVTp06dNHfuXL3//vtZ5gsEAHgc6P4NABnY+PHjdePGDc2ePdsmUMcpWrSo+vXrZ/393r17GjlypIoUKSInJycFBATonXfe0Z07d2yWCwgIUMOGDRUWFqbKlSvLxcVFZcqUsd5fumzZMpUpU0bOzs6qVKmSfv31V5vl4+4HPXnypEJCQuTm5iZfX1+NGDFChmHYtJ0wYYKqV6+uXLlyycXFRZUqVdLSpUvj7YvFYlHv3r21cOFClSpVSk5OTlq3bp113sP3DQ8bNkwWi0XHjx9Xhw4dlD17dnl5ealjx466efOmzXpv3bqlvn37ytvbWx4eHmrcuLH++uuvFN+LPG3aNJUqVUqurq7KkSOHKleurEWLFlnnJ3RP9aMe36CgIAUFBcWrpUOHDsleVT59+rR69uypYsWKycXFRbly5VKLFi1s6ps3b55atGghSapdu7YsFku8+4s//vhj63nw9fVVr169dO3atXh1li5dWnv27FHNmjXl6uqqd955R5K0e/duhYSEyNvbWy4uLipUqJA6deqUZO2S9O2336pBgwby9fWVk5OTihQpopEjR8brhhy37cOHD6t27dpydXVV/vz5NX78+Hjr/PPPP9W0aVO5ubkpT548euONN+K9JpKzcOFC5ciRQw0aNFDz5s21cOHCeG3Cw8NlsVg0YcIEffrpp9bX4dNPP61du3Ylu419+/Ypd+7cCgoK0o0bNySl/PUzd+5cPf/888qTJ4+cnJxUsmRJzZgxI0X75u3tbROo47z00kuSpCNHjqRoPQDwX8WVagDIwFatWqXChQurevXqKWrfpUsXzZ8/X82bN9ebb76pHTt2aMyYMTpy5IiWL19u0/b48eNq06aNunXrpldffVUTJkxQo0aNNHPmTL3zzjvq2bOnJGnMmDFq2bKljh07Jju7f76LvX//vurVq6dnnnlG48eP17p16zR06FDdu3dPI0aMsLabMmWKGjdurLZt2yomJkaLFy9WixYttHr1ajVo0MCmph9++EFfffWVevfuLW9v72QDZMuWLVWoUCGNGTNGe/fu1WeffaY8efJo3Lhx1jYdOnTQV199pXbt2umZZ57Rli1b4m03MbNmzVLfvn3VvHlz9evXT7dv39b+/fu1Y8cOtWnTJsllH/X4mrVr1y5t27ZNr7zyigoUKKDw8HDNmDFDQUFBOnz4sFxdXVWzZk317dtXU6dO1TvvvKMSJUpIkvW/w4YN0/DhwxUcHKwePXro2LFjmjFjhnbt2qWtW7fKwcHBur0rV67oxRdf1CuvvKJXX31VPj4+unjxourWravcuXPr7bffVvbs2RUeHq5ly5YlW/+8efPk7u6u/v37y93dXT/88IOGDBmiqKgoffjhhzZtr169qnr16qlZs2Zq2bKlli5dqkGDBqlMmTJ68cUXJT34UqVOnTo6c+aM+vbtK19fX33++ef64YcfUnVcFy5cqGbNmsnR0VGtW7e2Ho+nn346XttFixbp+vXr6tatmywWi8aPH69mzZrp5MmTNsfuYbt27VJISIgqV66sb7/9Vi4uLpJS/vqZMWOGSpUqpcaNGytbtmxatWqVevbsqdjYWPXq1StV+xrnwoULkh6EbgBAEgwAQIYUGRlpSDKaNGmSovb79u0zJBldunSxmT5gwABDkvHDDz9Yp/n7+xuSjG3btlmnrV+/3pBkuLi4GKdPn7ZO/+STTwxJxubNm63TQkNDDUlGnz59rNNiY2ONBg0aGI6OjsalS5es02/evGlTT0xMjFG6dGnj+eeft5kuybCzszMOHToUb98kGUOHDrX+PnToUEOS0alTJ5t2L730kpErVy7r73v27DEkGa+//rpNuw4dOsRbZ0KaNGlilCpVKsk2c+fONSQZp06dsk571ONbq1Yto1atWvG2FRoaavj7+9tM+/d+/Pt4G4ZhbN++3ZBkLFiwwDrt66+/jrddwzCMixcvGo6OjkbdunWN+/fvW6dPnz7dkGTMmTPHpk5JxsyZM23WsXz5ckOSsWvXrni1JCeh+rt162a4uroat2/fjrfth/fpzp07Rt68eY2XX37ZOm3y5MmGJOOrr76yTouOjjaKFi2a4P4nZPfu3YYkY+PGjYZhPPhbL1CggNGvXz+bdqdOnTIkGbly5TL+/vtv6/Rvv/3WkGSsWrXKOi00NNRwc3MzDMMwfv75Z8PT09No0KCBzT4mdDwSe/0kdNxCQkKMwoULJ7t/Cblz545RsmRJo1ChQsbdu3dNrQMA/ivo/g0AGVRUVJQkycPDI0Xtv/vuO0lS//79baa/+eabkhTv3uuSJUuqWrVq1t/jRjR+/vnnVbBgwXjTT548GW+bvXv3tv47rvt2TEyMvv/+e+v0uCtu0oMri5GRkXruuee0d+/eeOurVauWSpYsmcye/qN79+42vz/33HO6cuWK9djFdR+Puyocp0+fPilaf/bs2fXnn3+mqOvuv6XF8TXj4eN99+5dXblyRUWLFlX27NkTPOb/9v333ysmJkavv/66zZXzrl27ytPTM97fkZOTkzp27GgzLXv27JKk1atX6+7du6brv379ui5fvqznnntON2/e1NGjR23auru769VXX7X+7ujoqCpVqtgcy++++0758uVT8+bNrdNcXV312muvpbimhQsXysfHR7Vr15b04G+9VatWWrx4cYKjY7dq1Uo5cuSw/v7cc89JSvgcb968WSEhIapTp46WLVsWb8C7lL5+Hm4XGRmpy5cvq1atWjp58qQiIyNTvK9xevfurcOHD2v69OkZdpBAAMgoCNUAkEF5enpKehAsUuL06dOys7OLN6BQ3rx5lT17dp0+fdpm+sPBTpK8vLwkSX5+fglOv3r1qs10Ozs7FS5c2GbaU089JUk29++uXr1azzzzjJydnZUzZ07lzp1bM2bMSPCDfqFChZLbzST3IS7IxNUad0z+vd6UDro0aNAgubu7q0qVKgoMDFSvXr20detWU7Wl9viadevWLQ0ZMkR+fn5ycnKSt7e3cufOrWvXrqUoXMX9nRQrVsxmuqOjowoXLhzv7yh//vxydHS0mVarVi29/PLLGj58uLy9vdWkSRPNnTs3RfcxHzp0SC+99JK8vLzk6emp3LlzW4Pzv+svUKCALBaLzbQcOXLYHMvTp0+raNGi8dr9e/8Sc//+fS1evFi1a9fWqVOndPz4cR0/flxVq1ZVRESENm3aFG+Z5P4u49y+fVsNGjRQhQoV9NVXX8U7jlLKXz9bt25VcHCw3NzclD17duXOndt6f3tc28jISF24cMH68/fffye4zx9++KFmzZqlkSNHqn79+ik6TgDwX0aoBoAMytPTU76+vjp48GCqlvt3eEhMYiNWJzbd+NcAZCnx008/qXHjxnJ2dtbHH3+s7777Ths3blSbNm0SXN/DV9tSIi1rTUiJEiV07NgxLV68WM8++6y++eYbPfvssyka9flRjm9i5zAlzwzu06ePRo0apZYtW+qrr77Shg0btHHjRuXKlUuxsbHJLp9aCZ0zi8WipUuXavv27erdu7f++usvderUSZUqVbIOwJWQa9euqVatWvrtt980YsQIrVq1Shs3brTeI//v+h/3+Zce3Od//vx5LV68WIGBgdafli1bSlKCA5altC4nJyc1aNBAO3bssPaqeFhKXz8nTpxQnTp1dPnyZU2aNElr1qzRxo0b9cYbb0j657j169dP+fLls/40a9Ys3jbnzZunQYMGqXv37nrvvfdSeJQA4L+N/jwAkIE1bNhQn376qbZv327TlTgh/v7+io2N1R9//GEd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+vXrtWnTpnjrcXBw0NGjR1O0jwn59/mV/jmPic27f/++IiIilD9/fkVFRenkyZMqUaKE9Xg9rHbt2po1a5b27dundu3aKSoqSqdOnVLJkiWVN2/eeO2fe+65ePsZdwx27NihEydOxFvm9u3bunz5si5fvpxst/vEGEM9U9y2TKH0GXhu9uzZ6tmzp3r16qXevXsrb968Onr0qAYPHqxGjRrpo48+Us+ePa3tu3TpIgcHB02dOjVF61+yZIm++uorLViwIMFzAwAA0g6hGsgEpkyZokKFCmnu3Ln64IMP9MEHH8jZ2VktW7bUxIkTUxw+PD3jh41s2bIlOl16MFLxv3l7e8cLrZKs9yond6/n33//LUlauHBhku3MPvonqf25f/+fe2HjroQ/fI/1w+ICaXJXzFN6fuL2e9SoUanco5RJar9Tco5Tezzi/pvYvboJrSfuGCQ3aFZ0dLTpUP042Ls+uBJ9/9b9BOffiH0w3cM++Q5gR48eVffu3dWoUSNNmjTJOr1ixYpavny5nnrqKb399tvq1KmTnJ2dNX/+fK1du1Zff/11io7J33//rV69eqlBgwZq165dSnYPAAA8AkI1kAlky5ZNAwYM0IABA3Tu3Dlt2bJFc+fO1YIFC3ThwgWtX7/+idZz+fJlxcbGxgvWERERkpTsc7LjAt6qVavUsGHDx1NkCsTVEVf3v124cMGmXWJSen7i1hMVFSUPD4+02o00k9rjEfffixcvJtg+ofXELXPgwAGVLl360QpOxLCw2yluG7EvQjmezSHH3EkPDmfnZKds2bPp7qW7MmKNePNPxzz4YsLfIflB5jZu3Kh79+6pdu3a8ea5urqqSpUqWr58uY4fP67SpUtbe1Q8PEDcw9avXy+LxaJy5cpp3759OnPmjK5cuaI1a9bEG6k+TtwXJL/++muCvRgAAEDKEaqBTMbX11etW7dWq1atVKxYMX3//fe6detWqruCP4p79+5p+/btqlGjhs30n376SZLi3Sf9b1WrVpUkbd++PV1DdVydYWFhGjhwoM286Oho7d69Wy4uLipWrFiK15nU+alatar27t2rX375RS+88EKa7kta8PT0VOHChXX8+HH99ddfyp8/v838uMeDxYUwT09PFSpUSMePH9eFCxfidTOO+3t4WNWqVbVs2TJt3779sYXq4VuSv0f6H5fkVtwt2VAt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G6c333xTZcuWVcuWLeXm5qZVq1bp2LFjatKkiV599dUk17Fv3z41a9ZMVapUUcmSJZU3b1799ddfWrFihezs7PTGG29Y23br1k2//PKL5s+fr61btyo4OFi+vr6KiIjQ0aNHtWPHDi1atEgBAQGPec8TN2PGDD377LPq2rWrVq1apZIlS+rQoUNauXKlcufOrRkzZti0/+ijj1SjRg21b99eK1assD6neteuXdYRqx9Wr149vf/++xo5cqSKFi2qevXqyd/fX1euXNHx48f1008/6YMPPlCJEiWe5G6nyMCBA/Xtt99q3Lhx+vXXX1WxYkXt3btXGzZs0NNPP219vnqcnTt3qnbt2qpVq1a8AdukB1/efPHFF3J0dFT79u0T3W6BAgU0aNAgjR49Wk8//bReeukl+fv7Kzw8XCtWrFBMTIymTp0a71aFh78QOn/+/INpK25Zp739rKOKe9un/kAAAACYQKgGsqj+/furaNGimjRpkr744gvFxMToqaee0sSJE9W3b994o2D/W+XKlTVo0CCFhYVpzZo1unbtmvLmzavg4GC99dZbNl16LRaL5s2bp/r162vWrFlavXq1bty4oTx58igwMFATJkxQcHDw497lJBUrVky7d+/W8OHDtW7dOq1Zs0a5c+dWx44dNXTo0Hj3npcuXVpbt27VoEGDtG7dOq1fv17PPvustm7dqgkTJsQL1ZI0YsQI1axZU1OnTtWmTZt07do15cqVS4UKFdKwYcPiPZ4ro3Bzc9OWLVusg9Jt3rxZ+fLl05tvvqmhQ4cm+Fi1pKxYsUJXrlxRy5YtlStXriTbjho1SmXLltUnn3yi9evX6/r16/Ly8lLt2rXVr18/vfjii/GWmT9/fvxpv/0zMF2H8g4q7p2qkgEAAEyzGJngGS1RUVHy8vJSZGRkigZXAgD8hwxL/cjkccoUMjcA2ldj7pneZomj5m8DAAAAT05Kcyj3VAMAAAAAYBKhGgAAAAAAk7inGkgH165d0+TJk1PUNiWPRcos9u3bpxUrViTbLiAgINnRyQEAAICMgFANpINr166l+JnDWS1Up2S/a9WqRagGAABApkD3byAdBAQEpOmzhjOLDh06pGifE3pMEwAAAJAREaoBAAAAADCJUA0AAAAAgEmEagAAAAAATCJUAwAAAABgEqEaAAAAAACTCNUAAAAAAJhEqAYA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot.bar(title=\"Comparing simulators and Ankaa-2\", figsize=(12, 6))\n", + "text = f\"f_free = {f_free_Ankaa:.3f} \\nf_simple_noise_model = {f_simple:.3f} \\nf_noise_model = {f_noisy_Ankaa:.3f}\"\n", + "plt.text(1, 0.5, text, fontsize=14)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "6da72e22-a594-41e7-a4e2-cb82cfe0726a", + "metadata": {}, + "source": [ + "We see that compared to the full noise model, the simple model is less accurate, however, it is still a significant improvement over the noise-free case and has far fewer parameters in the model. " + ] + }, + { + "cell_type": "markdown", + "id": "b2c6b2ba-cb54-43f6-9a89-e29066b5192a", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this notebook, we showed how to construct a noise model for Rigetti Ankaa-2 based only on the available calibration data.\n", + "We used a coarse assumption of gate-independent single-qubit depolarizing noise and gate-dependant two-qubit noise. Our qubit-dependent model could be improved in many ways. We could add gate-dependence noise, or change the depolarizing channel to Pauli channels. " + ] + }, + { + "cell_type": "markdown", + "id": "98989c13", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "braket", + "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.10" + }, + "toc-autonumbering": false, + "toc-showcode": false, + "toc-showmarkdowntxt": false, + "toc-showtags": true + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb b/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb index 8bc0eab84..308822965 100644 --- a/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb +++ b/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb @@ -47,6 +47,7 @@ "# to make the output a little neater\n", "\n", "import numpy as np\n", + "\n", "np.set_printoptions(precision=3)" ] }, @@ -554,10 +555,7 @@ "device = LocalSimulator()\n", "\n", "result = device.run(program).result()\n", - "probs = np.outer(\n", - " result.result_types[0].value,\n", - " result.result_types[1].value\n", - ").flatten()\n", + "probs = np.outer(result.result_types[0].value, result.result_types[1].value).flatten()\n", "answer = np.argmax(probs)\n", "print(f\"{a_in} + {b_in} = {answer}\")" ] diff --git a/examples/braket_features/Simulating_Noise_On_Amazon_Braket.ipynb b/examples/braket_features/Simulating_Noise_On_Amazon_Braket.ipynb index a6597c0c7..0fe6de344 100644 --- a/examples/braket_features/Simulating_Noise_On_Amazon_Braket.ipynb +++ b/examples/braket_features/Simulating_Noise_On_Amazon_Braket.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -94,12 +95,13 @@ }, "outputs": [], "source": [ + "import numpy as np\n", + "from scipy.stats import unitary_group\n", + "\n", "from braket.aws import AwsDevice\n", "from braket.circuits import Circuit, gates, noises, observables\n", "from braket.devices import Devices, LocalSimulator\n", - "from braket.parametric import FreeParameter\n", - "import numpy as np\n", - "from scipy.stats import unitary_group" + "from braket.parametric import FreeParameter" ] }, { @@ -131,7 +133,7 @@ ], "source": [ "# build a simple circuit\n", - "circ = Circuit().h(0).cnot(0,1)\n", + "circ = Circuit().h(0).cnot(0, 1)\n", "\n", "# define a noise channel\n", "noise = noises.BitFlip(probability=0.1)\n", @@ -140,15 +142,15 @@ "circ.apply_gate_noise(noise)\n", "\n", "# select the local noise simulator\n", - "device = LocalSimulator('braket_dm')\n", + "device = LocalSimulator(\"braket_dm\")\n", "\n", "# run the circuit on the local simulator\n", - "task = device.run(circ, shots = 1000)\n", + "task = device.run(circ, shots=1000)\n", "\n", "# visualize the results\n", "result = task.result()\n", "measurement = result.measurement_counts\n", - "print('measurement results:', measurement)" + "print(\"measurement results:\", measurement)" ] }, { @@ -184,12 +186,13 @@ " Function to return simple GHZ circuit ansatz. Assumes all qubits in range(0, n_qubits-1)\n", " are entangled.\n", " \"\"\"\n", - " circuit = Circuit().h(0) \n", + " circuit = Circuit().h(0)\n", "\n", - " for ii in range(0, n_qubits-1):\n", - " circuit.cnot(control=ii, target=ii+1) \n", + " for ii in range(0, n_qubits - 1):\n", + " circuit.cnot(control=ii, target=ii + 1)\n", " return circuit\n", "\n", + "\n", "# build a 13-qubit GHZ circuit\n", "circ = ghz_circuit(13)\n", "\n", @@ -203,12 +206,12 @@ "device = AwsDevice(Devices.Amazon.DM1)\n", "\n", "# run the circuit on DM1\n", - "task = device.run(circ, shots = 10)\n", + "task = device.run(circ, shots=10)\n", "\n", "# visualize the results\n", "result = task.result()\n", "measurement = result.measurement_counts\n", - "print('measurement results:', measurement)" + "print(\"measurement results:\", measurement)" ] }, { @@ -289,11 +292,11 @@ "# define a bit flip noise channel with probability = 0.1\n", "noise = noises.BitFlip(probability=0.1)\n", "\n", - "print('name: ', noise.name)\n", - "print('qubit count: ', noise.qubit_count)\n", - "print('Kraus operators: ')\n", + "print(\"name: \", noise.name)\n", + "print(\"qubit count: \", noise.qubit_count)\n", + "print(\"Kraus operators: \")\n", "for matrix in noise.to_matrix():\n", - " print(matrix, '\\n')\n" + " print(matrix, \"\\n\")" ] }, { @@ -353,12 +356,12 @@ "outputs": [], "source": [ "# create an arbitrary 2-qubit Kraus matrix\n", - "E0 = unitary_group.rvs(4) * np.sqrt(0.2) \n", + "E0 = unitary_group.rvs(4) * np.sqrt(0.2)\n", "E1 = unitary_group.rvs(4) * np.sqrt(0.8)\n", - "K = [E0, E1] \n", + "K = [E0, E1]\n", "\n", "# define a two-qubit noise channel with Kraus operators\n", - "noise = noises.Kraus(K) " + "noise = noises.Kraus(K)" ] }, { @@ -387,7 +390,7 @@ } ], "source": [ - "K_invalid = [np.random.randn(2,2), np.random.randn(2,2)] \n", + "K_invalid = [np.random.randn(2, 2), np.random.randn(2, 2)]\n", "\n", "try:\n", " noise = noises.Kraus(K_invalid)\n", @@ -438,7 +441,15 @@ ], "source": [ "# apply depolarizing noise\n", - "circ = Circuit().x(0).x(1).cnot(0,1).depolarizing(1, probability=0.2).x(0).two_qubit_dephasing(target1=0, target2=1, probability=0.1)\n", + "circ = (\n", + " Circuit()\n", + " .x(0)\n", + " .x(1)\n", + " .cnot(0, 1)\n", + " .depolarizing(1, probability=0.2)\n", + " .x(0)\n", + " .two_qubit_dephasing(target1=0, target2=1, probability=0.1)\n", + ")\n", "print(circ)" ] }, @@ -509,9 +520,9 @@ "noise = noises.PhaseDamping(gamma=0.1)\n", "\n", "# the noise channel is applied to every gate in the circuit\n", - "circ = Circuit().x(0).bit_flip(0,0.1).cnot(0,1)\n", + "circ = Circuit().x(0).bit_flip(0, 0.1).cnot(0, 1)\n", "circ.apply_gate_noise(noise)\n", - "print('Noise is applied to every gate in the circuit:\\n')\n", + "print(\"Noise is applied to every gate in the circuit:\\n\")\n", "print(circ)" ] }, @@ -569,9 +580,9 @@ ], "source": [ "# the noise channel is applied to all the X gates in the circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", - "circ.apply_gate_noise(noise, target_gates = gates.X)\n", - "print('Noise is applied to every X gate:\\n')\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", + "circ.apply_gate_noise(noise, target_gates=gates.X)\n", + "print(\"Noise is applied to every X gate:\\n\")\n", "print(circ)" ] }, @@ -613,11 +624,11 @@ } ], "source": [ - "U1=unitary_group.rvs(4)\n", - "U2=unitary_group.rvs(4)\n", - "circ = Circuit().x(0).y(1).unitary((0,1),U1).cnot(0,2).x(1).z(2).unitary((1,2),U2)\n", - "circ.apply_gate_noise(noise, target_unitary = U2)\n", - "print('Noise is applied to U2:\\n')\n", + "U1 = unitary_group.rvs(4)\n", + "U2 = unitary_group.rvs(4)\n", + "circ = Circuit().x(0).y(1).unitary((0, 1), U1).cnot(0, 2).x(1).z(2).unitary((1, 2), U2)\n", + "circ.apply_gate_noise(noise, target_unitary=U2)\n", + "print(\"Noise is applied to U2:\\n\")\n", "print(circ)" ] }, @@ -660,9 +671,9 @@ ], "source": [ "# the noise channel is applied to every gate on qubits 0 and 2\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", - "circ.apply_gate_noise(noise, target_qubits = [0,2])\n", - "print('Noise is applied to every gate in qubits 0 and 2:\\n')\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", + "circ.apply_gate_noise(noise, target_qubits=[0, 2])\n", + "print(\"Noise is applied to every gate in qubits 0 and 2:\\n\")\n", "print(circ)" ] }, @@ -705,9 +716,9 @@ ], "source": [ "# the noise channel is applied to X gate on qubits 0\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(0).x(1).z(2)\n", - "circ.apply_gate_noise(noise, target_gates = gates.X, target_qubits = 0)\n", - "print('Noise is applied to X gates in qubits 0:\\n')\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(0).x(1).z(2)\n", + "circ.apply_gate_noise(noise, target_gates=gates.X, target_qubits=0)\n", + "print(\"Noise is applied to X gates in qubits 0:\\n\")\n", "print(circ)" ] }, @@ -753,10 +764,10 @@ "noise1 = noises.Depolarizing(probability=0.1)\n", "noise2 = noises.BitFlip(probability=0.2)\n", "\n", - "# apply a list of noise channels \n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", - "circ.apply_gate_noise([noise1, noise2], target_qubits = [0,1])\n", - "print('Noise channels are applied to every gate in qubits 0 and 1:\\n')\n", + "# apply a list of noise channels\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", + "circ.apply_gate_noise([noise1, noise2], target_qubits=[0, 1])\n", + "print(\"Noise channels are applied to every gate in qubits 0 and 1:\\n\")\n", "print(circ)" ] }, @@ -802,9 +813,9 @@ "noise = noises.TwoQubitDephasing(probability=0.1)\n", "\n", "# apply the noise to the circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2).swap(1,0)\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2).swap(1, 0)\n", "circ.apply_gate_noise(noise)\n", - "print('The two-qubit noise channel is applied to all the two-qubit gates in the circuit:\\n')\n", + "print(\"The two-qubit noise channel is applied to all the two-qubit gates in the circuit:\\n\")\n", "print(circ)" ] }, @@ -866,9 +877,9 @@ "noise = noises.Depolarizing(probability=0.1)\n", "\n", "# the noise channel is applied as the initialization noise to the circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", "circ.apply_initialization_noise(noise)\n", - "print('Initialization noise is applied to the circuit:\\n')\n", + "print(\"Initialization noise is applied to the circuit:\\n\")\n", "print(circ)" ] }, @@ -911,9 +922,9 @@ "noise = noises.TwoQubitDephasing(probability=0.1)\n", "\n", "# the noise channel is applied as the initialization noise to the circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,1).x(1).z(0)\n", + "circ = Circuit().x(0).y(1).cnot(0, 1).x(1).z(0)\n", "circ.apply_initialization_noise(noise)\n", - "print('Initialization noise is applied to the circuit:\\n')\n", + "print(\"Initialization noise is applied to the circuit:\\n\")\n", "print(circ)" ] }, @@ -975,9 +986,9 @@ "noise = noises.Depolarizing(probability=0.1)\n", "\n", "# the noise channel is applied as the readout noise to the circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", "circ.apply_readout_noise(noise)\n", - "print('Read-out noise is applied to the circuit:\\n')\n", + "print(\"Read-out noise is applied to the circuit:\\n\")\n", "print(circ)" ] }, @@ -1031,9 +1042,17 @@ "noise = noises.PhaseFlip(probability=0.2)\n", "\n", "# create a circuit and add noise directly to the circuit\n", - "circ = Circuit().x(0).y(1).bit_flip(0,0.1).cnot(1,2).two_qubit_depolarizing(1, 2, probability=0.1).z(2)\n", + "circ = (\n", + " Circuit()\n", + " .x(0)\n", + " .y(1)\n", + " .bit_flip(0, 0.1)\n", + " .cnot(1, 2)\n", + " .two_qubit_depolarizing(1, 2, probability=0.1)\n", + " .z(2)\n", + ")\n", "circ.apply_gate_noise(noise, target_qubits=0)\n", - "print('Noise channels are applied to the circuit:\\n')\n", + "print(\"Noise channels are applied to the circuit:\\n\")\n", "print(circ)" ] }, @@ -1091,15 +1110,15 @@ "# define the noise channel\n", "noise = noises.AmplitudeDamping(gamma=0.1)\n", "# create a circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", - "# apply the noise to qubits 0 and 2 in the circuit \n", - "circ.apply_gate_noise(noise, target_qubits = [0,2])\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", + "# apply the noise to qubits 0 and 2 in the circuit\n", + "circ.apply_gate_noise(noise, target_qubits=[0, 2])\n", "\n", "# attach the result types\n", "circ.probability()\n", "circ.expectation(observable=observables.Z(0))\n", "# attach the density matrix with target=[0,1], and the reduced density matrix of qubits 0,1 will be returned\n", - "circ.density_matrix(target=[0,1])\n", + "circ.density_matrix(target=[0, 1])\n", "print(circ)\n", "\n", "# choose the noise simulator, which is called \"braket_dm\"\n", @@ -1109,11 +1128,11 @@ "result = task.result()\n", "\n", "\n", - "print('- Probability is: ')\n", + "print(\"- Probability is: \")\n", "print(result.values[0])\n", - "print('- Expectation value is: ')\n", + "print(\"- Expectation value is: \")\n", "print(result.values[1])\n", - "print('- The reduced Density Matrix is: ')\n", + "print(\"- The reduced Density Matrix is: \")\n", "print(result.values[2])" ] }, @@ -1160,8 +1179,8 @@ ], "source": [ "# create a circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", - "circ.apply_gate_noise(noise, target_qubits = [0,2])\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", + "circ.apply_gate_noise(noise, target_qubits=[0, 2])\n", "\n", "circ.probability()\n", "circ.expectation(observable=observables.Z(0))\n", @@ -1171,9 +1190,9 @@ "task = device.run(circ, shots=100)\n", "result = task.result()\n", "\n", - "print('- Probability is: ')\n", + "print(\"- Probability is: \")\n", "print(result.values[0])\n", - "print('- Expectation value is: ')\n", + "print(\"- Expectation value is: \")\n", "print(result.values[1])" ] }, @@ -1223,12 +1242,12 @@ ], "source": [ "# define the free parameter\n", - "gamma = FreeParameter('gamma')\n", + "gamma = FreeParameter(\"gamma\")\n", "# define the noise channel\n", "noise = noises.AmplitudeDamping(gamma=gamma)\n", "# create a circuit\n", - "circ = Circuit().x(0).y(1).cnot(0,2).x(1).z(2)\n", - "circ.apply_gate_noise(noise, target_qubits = [0,2])\n", + "circ = Circuit().x(0).y(1).cnot(0, 2).x(1).z(2)\n", + "circ.apply_gate_noise(noise, target_qubits=[0, 2])\n", "\n", "circ.probability()\n", "circ.expectation(observable=observables.Z(0))\n", @@ -1238,18 +1257,18 @@ "task = device.run(circ(gamma=0.1), shots=100)\n", "result = task.result()\n", "\n", - "print('- Probability when gamma=0.1 is: ')\n", + "print(\"- Probability when gamma=0.1 is: \")\n", "print(result.values[0])\n", - "print('- Expectation value when gamma=0.1 is: ')\n", + "print(\"- Expectation value when gamma=0.1 is: \")\n", "print(result.values[1])\n", "\n", "# run the circuit with gamma = 0.3\n", "task = device.run(circ(gamma=0.3), shots=100)\n", "result = task.result()\n", "\n", - "print('- Probability when gamma=0.3 is: ')\n", + "print(\"- Probability when gamma=0.3 is: \")\n", "print(result.values[0])\n", - "print('- Expectation value when gamma=0.3 is: ')\n", + "print(\"- Expectation value when gamma=0.3 is: \")\n", "print(result.values[1])" ] }, @@ -1285,8 +1304,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/braket_features/TN1_demo_local_vs_non-local_random_circuits.ipynb b/examples/braket_features/TN1_demo_local_vs_non-local_random_circuits.ipynb index 5940fa65c..c5db4fd66 100644 --- a/examples/braket_features/TN1_demo_local_vs_non-local_random_circuits.ipynb +++ b/examples/braket_features/TN1_demo_local_vs_non-local_random_circuits.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -43,13 +44,14 @@ }, "outputs": [], "source": [ - "from braket.circuits import Circuit\n", - "from braket.aws import AwsDevice\n", - "from braket.devices import Devices\n", + "import time\n", "\n", - "import numpy as np\n", "import matplotlib.pyplot as plt\n", - "import time" + "import numpy as np\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit\n", + "from braket.devices import Devices" ] }, { @@ -130,40 +132,54 @@ " \"\"\"Yields a CZ between a random qubit and its next nearest neighbor.\n", " For simplicity, we choose a random qubit from the first N-1 qubits for\n", " the control and we set the target to be qubit i+1, where i is the control.\"\"\"\n", - " a = np.random.choice(range(len(qubits)-1), 1, replace=True)[0]\n", - " yield Circuit().cz(qubits[a],qubits[a+1])\n", + " a = np.random.choice(range(len(qubits) - 1), 1, replace=True)[0]\n", + " yield Circuit().cz(qubits[a], qubits[a + 1])\n", + "\n", "\n", - "def local_Hayden_Preskill_generator(qubits,numgates):\n", + "def local_Hayden_Preskill_generator(qubits, numgates):\n", " \"\"\"Yields the circuit elements for a scrambling unitary.\n", " Generates a circuit with numgates gates by laying down a\n", " random gate at each time step. Gates are chosen from single\n", - " qubit unitary rotations by a random angle, Hadamard, or a \n", + " qubit unitary rotations by a random angle, Hadamard, or a\n", " controlled-Z between a qubit and its nearest neighbor (i.e.,\n", " incremented by 1).\"\"\"\n", " for i in range(numgates):\n", - " yield np.random.choice([\n", - " Circuit().rx(np.random.choice(qubits,1,replace=True),np.random.ranf()),\n", - " Circuit().ry(np.random.choice(qubits,1,replace=True),np.random.ranf()),\n", - " Circuit().rz(np.random.choice(qubits,1,replace=True),np.random.ranf()),\n", - " Circuit().h(np.random.choice(qubits,1,replace=True)),\n", - " CZtuple_generator(qubits), # For all-to-all: Circuit().cz(*np.random.choice(qubits,2,replace=False)),\n", - " ],1,replace=True,p=[1/8,1/8,1/8,1/8,1/2])\n", - " \n", - "def non_local_Hayden_Preskill_generator(qubits,numgates):\n", + " yield np.random.choice(\n", + " [\n", + " Circuit().rx(np.random.choice(qubits, 1, replace=True), np.random.ranf()),\n", + " Circuit().ry(np.random.choice(qubits, 1, replace=True), np.random.ranf()),\n", + " Circuit().rz(np.random.choice(qubits, 1, replace=True), np.random.ranf()),\n", + " Circuit().h(np.random.choice(qubits, 1, replace=True)),\n", + " CZtuple_generator(\n", + " qubits\n", + " ), # For all-to-all: Circuit().cz(*np.random.choice(qubits,2,replace=False)),\n", + " ],\n", + " 1,\n", + " replace=True,\n", + " p=[1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 2],\n", + " )\n", + "\n", + "\n", + "def non_local_Hayden_Preskill_generator(qubits, numgates):\n", " \"\"\"Yields the circuit elements for a scrambling unitary.\n", " Generates a circuit with numgates gates by laying down a\n", " random gate at each time step. Gates are chosen from single\n", - " qubit unitary rotations by a random angle, Hadamard, or a \n", + " qubit unitary rotations by a random angle, Hadamard, or a\n", " controlled-Z between a qubit and its nearest neighbor (i.e.,\n", " incremented by 1).\"\"\"\n", " for i in range(numgates):\n", - " yield np.random.choice([\n", - " Circuit().rx(np.random.choice(qubits,1,replace=True),np.random.ranf()),\n", - " Circuit().ry(np.random.choice(qubits,1,replace=True),np.random.ranf()),\n", - " Circuit().rz(np.random.choice(qubits,1,replace=True),np.random.ranf()),\n", - " Circuit().h(np.random.choice(qubits,1,replace=True)),\n", - " Circuit().cz(*np.random.choice(qubits,2,replace=False)),\n", - " ],1,replace=True,p=[1/8,1/8,1/8,1/8,1/2])" + " yield np.random.choice(\n", + " [\n", + " Circuit().rx(np.random.choice(qubits, 1, replace=True), np.random.ranf()),\n", + " Circuit().ry(np.random.choice(qubits, 1, replace=True), np.random.ranf()),\n", + " Circuit().rz(np.random.choice(qubits, 1, replace=True), np.random.ranf()),\n", + " Circuit().h(np.random.choice(qubits, 1, replace=True)),\n", + " Circuit().cz(*np.random.choice(qubits, 2, replace=False)),\n", + " ],\n", + " 1,\n", + " replace=True,\n", + " p=[1 / 8, 1 / 8, 1 / 8, 1 / 8, 1 / 2],\n", + " )" ] }, { @@ -206,7 +222,7 @@ "source": [ "# Generate an example of a local Hayden Preskill circuit\n", "test_circuit = Circuit()\n", - "test_circuit.add(local_Hayden_Preskill_generator(range(5),20))\n", + "test_circuit.add(local_Hayden_Preskill_generator(range(5), 20))\n", "print(test_circuit)" ] }, @@ -243,7 +259,7 @@ "source": [ "# Generate an example of a non-local Hayden Preskill circuit\n", "test_circuit = Circuit()\n", - "test_circuit.add(non_local_Hayden_Preskill_generator(range(5),20))\n", + "test_circuit.add(non_local_Hayden_Preskill_generator(range(5), 20))\n", "print(test_circuit)" ] }, @@ -287,12 +303,14 @@ } ], "source": [ - "num_qubits = 20 # Number of qubits\n", - "num_layers = 10 # Number of layers. A layer consists of num_qubits gates.\n", + "num_qubits = 20 # Number of qubits\n", + "num_layers = 10 # Number of layers. A layer consists of num_qubits gates.\n", "numgates = num_qubits * num_layers # Total number of gates.\n", "print(f\"{num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", "circ = Circuit()\n", - "circ.add(local_Hayden_Preskill_generator(range(num_qubits), numgates)); # Create the circuit with numgates gates." + "circ.add(\n", + " local_Hayden_Preskill_generator(range(num_qubits), numgates)\n", + "); # Create the circuit with numgates gates." ] }, { @@ -339,20 +357,20 @@ "%%time\n", "# define quantum task\n", "print(f\"Running: {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", - "task = device.run(circ, shots=1000, poll_timeout_seconds = 1000)\n", + "task = device.run(circ, shots=1000, poll_timeout_seconds=1000)\n", "\n", - "# get id and status of submitted quantum \n", + "# get id and status of submitted quantum\n", "task_id = task.id\n", "status = task.state()\n", - "print('ID of quantum task:', task_id)\n", - "print('Status of quantum task:', status)\n", + "print(\"ID of quantum task:\", task_id)\n", + "print(\"Status of quantum task:\", status)\n", "\n", "# wait for job to complete\n", - "terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", + "terminal_states = [\"COMPLETED\", \"FAILED\", \"CANCELLED\"]\n", "while status not in terminal_states:\n", - " time.sleep(20) # Update this for shorter circuits.\n", + " time.sleep(20) # Update this for shorter circuits.\n", " status = task.state()\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", "\n", "# get results of quantum task\n", "result = task.result()\n", @@ -406,7 +424,8 @@ ], "source": [ "from IPython.display import Image\n", - "Image(filename='permuted_circuit.png', width=400)" + "\n", + "Image(filename=\"permuted_circuit.png\", width=400)" ] }, { @@ -443,18 +462,17 @@ } ], "source": [ - "num_qubits = 50 # Number of qubits\n", - "num_layers = 10 # Number of layers. A layer consists of num_qubits gates.\n", + "num_qubits = 50 # Number of qubits\n", + "num_layers = 10 # Number of layers. A layer consists of num_qubits gates.\n", "numgates = num_qubits * num_layers # Total number of gates.\n", - "qubits=range(num_qubits) # Generate the (1D) qubits\n", + "qubits = range(num_qubits) # Generate the (1D) qubits\n", "print(f\"{num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", "\n", "# Generate the circuit with numgates gates acting on qubits.\n", "circ = Circuit()\n", - "circ.add(local_Hayden_Preskill_generator(qubits,numgates));\n", - "\n", + "circ.add(local_Hayden_Preskill_generator(qubits, numgates))\n", "# Choose a random permutation of the qubits\n", - "permuted_qubits=np.random.permutation(qubits)\n", + "permuted_qubits = np.random.permutation(qubits)\n", "\n", "# Copy the circuit circ acting on the permuted qubits\n", "perm = Circuit().add_circuit(circ, target_mapping=dict(zip(qubits, permuted_qubits)))\n", @@ -497,13 +515,15 @@ "source": [ "%%time\n", "# define quantum task\n", - "task = device.run(circ, shots=1, poll_timeout_seconds = 1000)\n", + "task = device.run(circ, shots=1, poll_timeout_seconds=1000)\n", "\n", - "# get results of quantum \n", + "# get results of quantum\n", "result = task.result()\n", "\n", "# get measurement shots\n", - "print(f\"Running the local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", + "print(\n", + " f\"Running the local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\"\n", + ")\n", "counts = result.measurement_counts\n", "print(f\"The sample was: {next(iter(counts))}.\")" ] @@ -532,13 +552,15 @@ "source": [ "%%time\n", "# define quantum task\n", - "task = device.run(perm, shots=1, poll_timeout_seconds = 1000)\n", + "task = device.run(perm, shots=1, poll_timeout_seconds=1000)\n", "\n", "# get results of quantum task\n", "result = task.result()\n", "\n", "# get measurement shots\n", - "print(f\"Running the non-local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", + "print(\n", + " f\"Running the non-local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\"\n", + ")\n", "counts = result.measurement_counts\n", "print(f\"The sample was: {next(iter(counts))}.\")" ] @@ -590,19 +612,18 @@ } ], "source": [ - "num_qubits = 50 # Number of qubits\n", - "num_layers = 8 # Number of layers. A layer consists of num_qubits gates.\n", + "num_qubits = 50 # Number of qubits\n", + "num_layers = 8 # Number of layers. A layer consists of num_qubits gates.\n", "numgates = num_qubits * num_layers # Total number of gates.\n", - "qubits=range(num_qubits) # Generate the (1D) qubits\n", + "qubits = range(num_qubits) # Generate the (1D) qubits\n", "print(f\"{num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", "\n", "# Generate the local circuit with numgates gates acting on qubits.\n", "localcirc = Circuit()\n", - "localcirc.add(local_Hayden_Preskill_generator(qubits,numgates));\n", - "\n", + "localcirc.add(local_Hayden_Preskill_generator(qubits, numgates))\n", "# Generate the non-local circuit with numgates gates acting on qubits.\n", "nonlocalcirc = Circuit()\n", - "nonlocalcirc.add(non_local_Hayden_Preskill_generator(qubits,numgates));\n", + "nonlocalcirc.add(non_local_Hayden_Preskill_generator(qubits, numgates));\n", "\n", "##Uncomment for testing:\n", "# print(permuted_qubits)\n", @@ -641,13 +662,15 @@ "source": [ "%%time\n", "# define quantum task\n", - "task = device.run(localcirc, shots=1, poll_timeout_seconds = 1000)\n", + "task = device.run(localcirc, shots=1, poll_timeout_seconds=1000)\n", "\n", "# get results of quantum task\n", "result = task.result()\n", "\n", "# get measurement shots\n", - "print(f\"Running the local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", + "print(\n", + " f\"Running the local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\"\n", + ")\n", "counts = result.measurement_counts\n", "print(f\"The sample was: {next(iter(counts))}.\")" ] @@ -683,13 +706,15 @@ "source": [ "%%time\n", "# define quantum task\n", - "task = device.run(nonlocalcirc, shots=1, poll_timeout_seconds = 1000)\n", + "task = device.run(nonlocalcirc, shots=1, poll_timeout_seconds=1000)\n", "\n", "# get results of quantum task\n", "result = task.result()\n", "\n", "# get measurement shots\n", - "print(f\"Running the non-local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", + "print(\n", + " f\"Running the non-local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\"\n", + ")\n", "counts = result.measurement_counts\n", "print(f\"The sample was: {next(iter(counts))}.\")" ] @@ -736,19 +761,18 @@ } ], "source": [ - "num_qubits = 50 # Number of qubits\n", - "num_layers = 20 # Number of layers. A layer consists of num_qubits gates.\n", + "num_qubits = 50 # Number of qubits\n", + "num_layers = 20 # Number of layers. A layer consists of num_qubits gates.\n", "numgates = num_qubits * num_layers # Total number of gates.\n", - "qubits=range(num_qubits) # Generate the (1D) qubits\n", + "qubits = range(num_qubits) # Generate the (1D) qubits\n", "print(f\"{num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", "\n", "# Generate the circuit with numgates gates acting on qubits.\n", "localcirc = Circuit()\n", - "localcirc.add(local_Hayden_Preskill_generator(qubits,numgates));\n", - "\n", + "localcirc.add(local_Hayden_Preskill_generator(qubits, numgates))\n", "# Generate the circuit with numgates gates acting on qubits.\n", "nonlocalcirc = Circuit()\n", - "nonlocalcirc.add(non_local_Hayden_Preskill_generator(qubits,numgates));\n", + "nonlocalcirc.add(non_local_Hayden_Preskill_generator(qubits, numgates));\n", "\n", "##Uncomment for testing:\n", "# print(permuted_qubits)\n", @@ -787,13 +811,15 @@ "source": [ "%%time\n", "# define quantum task\n", - "task = device.run(localcirc, shots=1, poll_timeout_seconds = 1000)\n", + "task = device.run(localcirc, shots=1, poll_timeout_seconds=1000)\n", "\n", "# get results of quantum task\n", "result = task.result()\n", "\n", "# get measurement shots\n", - "print(f\"Running the local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", + "print(\n", + " f\"Running the local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\"\n", + ")\n", "counts = result.measurement_counts\n", "print(f\"The sample was: {next(iter(counts))}.\")" ] @@ -822,13 +848,13 @@ "source": [ "##%%time\n", "## define quantum task\n", - "#task = device.run(nonlocalcirc, shots=1, poll_timeout_seconds = 1000)\n", + "# task = device.run(nonlocalcirc, shots=1, poll_timeout_seconds = 1000)\n", "\n", "## get results of quantum task\n", - "#result = task.result()\n", + "# result = task.result()\n", "\n", "## get measurement shots\n", - "#print(f\"Running the non-local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", + "# print(f\"Running the non-local circuit with {num_qubits} qubits, {num_layers} layers = {numgates} total gates\")\n", "## counts = result.measurement_counts\n", "## print(f\"The sample was: {next(iter(counts))}.\")" ] @@ -852,7 +878,7 @@ }, "outputs": [], "source": [ - "#print(task._metadata['failureReason'])" + "# print(task._metadata['failureReason'])" ] }, { @@ -916,9 +942,15 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print('This estimate does not included the task which fails after rehearsal, for which charges may apply. See https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html for more details.')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " \"This estimate does not included the task which fails after rehearsal, for which charges may apply. See https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html for more details.\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/braket_features/Using_The_Adjoint_Gradient_Result_Type.ipynb b/examples/braket_features/Using_The_Adjoint_Gradient_Result_Type.ipynb index 296a5bf99..42346a933 100644 --- a/examples/braket_features/Using_The_Adjoint_Gradient_Result_Type.ipynb +++ b/examples/braket_features/Using_The_Adjoint_Gradient_Result_Type.ipynb @@ -13,6 +13,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -295,17 +296,19 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", + "import random\n", + "import time\n", + "\n", "import matplotlib.pyplot as plt\n", "import networkx as nx\n", - "import time\n", - "import random\n", + "import numpy as np\n", + "\n", "# magic line for producing visualizations in notebook\n", "%matplotlib inline\n", "\n", "# AWS imports: Import Braket SDK modules\n", - "from braket.circuits import Circuit, FreeParameter, observables\n", "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit, FreeParameter, observables\n", "from braket.devices import Devices" ] }, @@ -358,11 +361,11 @@ } ], "source": [ - "theta = FreeParameter('theta')\n", - "gamma = FreeParameter('gamma')\n", + "theta = FreeParameter(\"theta\")\n", + "gamma = FreeParameter(\"gamma\")\n", "circuit = Circuit().h(0).cnot(0, 1).rx(0, theta).rx(1, theta).xx(0, 1, gamma)\n", "# add the adjoint gradient result type\n", - "#circuit.adjoint_gradient(observable=observables.Z(0) @ observables.Z(1), parameters=['theta', gamma])\n", + "# circuit.adjoint_gradient(observable=observables.Z(0) @ observables.Z(1), parameters=['theta', gamma])\n", "circuit.adjoint_gradient(observable=observables.Z(0) @ observables.Z(1), parameters=[])" ] }, @@ -393,8 +396,8 @@ } ], "source": [ - "result_1 = device.run(circuit, shots=0, inputs = {'theta': 0.1, 'gamma': 0.05}).result()\n", - "result_2 = device.run(circuit, shots=0, inputs = {'theta': 0.2, 'gamma': 0.1}).result()\n", + "result_1 = device.run(circuit, shots=0, inputs={\"theta\": 0.1, \"gamma\": 0.05}).result()\n", + "result_2 = device.run(circuit, shots=0, inputs={\"theta\": 0.2, \"gamma\": 0.1}).result()\n", "\n", "print(f\"Gradient when theta = 0.1, gamma = 0.05: {result_1.values[0]}\")\n", "print(f\"Gradient when theta = 0.2, gamma = 0.1: {result_2.values[0]}\")" @@ -429,7 +432,7 @@ "circuit = Circuit().h(0).cnot(0, 1).rx(0, theta).rx(1, theta).xx(0, 1, gamma)\n", "# add the gradient result type\n", "circuit.adjoint_gradient(observable=observables.Z(0) @ observables.Z(2), parameters=[])\n", - "result_all = device.run(circuit, shots=0, inputs = {'theta': 0.2, 'gamma': 0.1}).result()\n", + "result_all = device.run(circuit, shots=0, inputs={\"theta\": 0.2, \"gamma\": 0.1}).result()\n", "print(f\"Gradient when theta = 0.2, gamma = 0.1: {result_all.values[0]}\")" ] }, @@ -488,14 +491,14 @@ "pos = nx.spring_layout(G)\n", "\n", "# choose random weights\n", - "for (u, v) in G.edges():\n", - " G.edges[u,v]['weight'] = random.uniform(0, 1)\n", + "for u, v in G.edges():\n", + " G.edges[u, v][\"weight\"] = random.uniform(0, 1)\n", "\n", "# draw graph\n", "nx.draw(G, pos)\n", "plt.show()\n", "\n", - "# set Ising matrix \n", + "# set Ising matrix\n", "Jfull = nx.adjacency_matrix(G).todense()\n", "Jfull = np.array(Jfull)\n", "\n", @@ -515,6 +518,7 @@ "outputs": [], "source": [ "from utils_qaoa import circuit, train, train_adjoint\n", + "\n", "# auto reload external files, so that we can edit the external .py file and immediately see the changes here\n", "%load_ext autoreload\n", "%autoreload 2" @@ -553,7 +557,7 @@ "\n", "# User-defined hypers\n", "DEPTH = 2 # circuit depth for QAOA\n", - "OPT_METHOD = {'adjoint': 'BFGS', 'gradient-free': 'BFGS'}\n", + "OPT_METHOD = {\"adjoint\": \"BFGS\", \"gradient-free\": \"BFGS\"}\n", "\n", "# set up the problem\n", "n_qubits = J.shape[0]\n", @@ -562,14 +566,14 @@ "energy_init = 0.0\n", "\n", "##################################################################################\n", - "# run QAOA optimization on graph \n", + "# run QAOA optimization on graph\n", "##################################################################################\n", "\n", - "print('Circuit depth hyperparameter:', DEPTH)\n", - "print('Problem size:', n_qubits)\n", + "print(\"Circuit depth hyperparameter:\", DEPTH)\n", + "print(\"Problem size:\", n_qubits)\n", "\n", "# set options for classical optimization\n", - "options = {'disp': True, 'maxiter': 3}\n", + "options = {\"disp\": True, \"maxiter\": 3}\n", "verbose = True\n", "\n", "np.random.seed(2)\n", @@ -662,29 +666,37 @@ ], "source": [ "adjoint_costs = Tracker().start()\n", - "#set up trackers to keep track of results\n", + "# set up trackers to keep track of results\n", "adjoint_tracker = {\n", - " 'count': 1, # Elapsed optimization steps\n", - " 'optimal_energy': energy_init, # Global optimal energy\n", - " 'opt_energies': [], # Optimal energy at each step\n", - " 'global_energies': [], # Global optimal energy at each step\n", - " 'costs': [], # Cost (energy) at each step\n", - " 'res': None, # Quantum result object\n", - " 'params': [] # Track parameters\n", + " \"count\": 1, # Elapsed optimization steps\n", + " \"optimal_energy\": energy_init, # Global optimal energy\n", + " \"opt_energies\": [], # Optimal energy at each step\n", + " \"global_energies\": [], # Global optimal energy at each step\n", + " \"costs\": [], # Cost (energy) at each step\n", + " \"res\": None, # Quantum result object\n", + " \"params\": [], # Track parameters\n", "}\n", "\n", "# kick off training for adjoint\n", "start = time.time()\n", "result_energy, result_angle, adjoint_tracker = train_adjoint(\n", - " device = device, options=options, p=DEPTH, ising=J, n_qubits=n_qubits,\n", - " opt_method=OPT_METHOD['adjoint'], tracker=adjoint_tracker, params0=params0, verbose=verbose)\n", + " device=device,\n", + " options=options,\n", + " p=DEPTH,\n", + " ising=J,\n", + " n_qubits=n_qubits,\n", + " opt_method=OPT_METHOD[\"adjoint\"],\n", + " tracker=adjoint_tracker,\n", + " params0=params0,\n", + " verbose=verbose,\n", + ")\n", "end = time.time()\n", "\n", "# print execution time\n", - "print('Code execution time using adjoint differentiation [sec]:', end - start)\n", + "print(\"Code execution time using adjoint differentiation [sec]:\", end - start)\n", "\n", "# print optimized results\n", - "print('Optimal energy using adjoint differentiation:', adjoint_tracker['optimal_energy'])" + "print(\"Optimal energy using adjoint differentiation:\", adjoint_tracker[\"optimal_energy\"])" ] }, { @@ -880,27 +892,35 @@ "no_adjoint_costs = Tracker().start()\n", "energy_init = 0.0\n", "tracker = {\n", - " 'count': 1, # Elapsed optimization steps\n", - " 'optimal_energy': energy_init, # Global optimal energy\n", - " 'opt_energies': [], # Optimal energy at each step\n", - " 'global_energies': [], # Global optimal energy at each step\n", - " 'costs': [], # Cost (energy) at each step\n", - " 'res': None, # Quantum result object\n", - " 'params': [] # Track parameters\n", + " \"count\": 1, # Elapsed optimization steps\n", + " \"optimal_energy\": energy_init, # Global optimal energy\n", + " \"opt_energies\": [], # Optimal energy at each step\n", + " \"global_energies\": [], # Global optimal energy at each step\n", + " \"costs\": [], # Cost (energy) at each step\n", + " \"res\": None, # Quantum result object\n", + " \"params\": [], # Track parameters\n", "}\n", "\n", "# kick off training for gradient-free\n", "start = time.time()\n", "result_energy, result_angle, tracker = train(\n", - " device = device, options=options, p=DEPTH, ising=J, n_qubits=n_qubits, \n", - " opt_method=OPT_METHOD['gradient-free'], tracker=tracker, params0=params0, verbose=verbose)\n", + " device=device,\n", + " options=options,\n", + " p=DEPTH,\n", + " ising=J,\n", + " n_qubits=n_qubits,\n", + " opt_method=OPT_METHOD[\"gradient-free\"],\n", + " tracker=tracker,\n", + " params0=params0,\n", + " verbose=verbose,\n", + ")\n", "end = time.time()\n", "\n", "# print execution time\n", - "print('Code execution time without adjoint differentiation [sec]:', end - start)\n", + "print(\"Code execution time without adjoint differentiation [sec]:\", end - start)\n", "\n", "# print optimized results\n", - "print('Optimal energy:', tracker['optimal_energy'])" + "print(\"Optimal energy:\", tracker[\"optimal_energy\"])" ] }, { @@ -983,8 +1003,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] }, { diff --git a/examples/braket_features/Using_the_experimental_local_simulator.ipynb b/examples/braket_features/Using_the_experimental_local_simulator.ipynb index acc124961..653fffb25 100644 --- a/examples/braket_features/Using_the_experimental_local_simulator.ipynb +++ b/examples/braket_features/Using_the_experimental_local_simulator.ipynb @@ -37,19 +37,17 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", "import math\n", "import time\n", "\n", "# AWS imports: Import Braket SDK modules\n", - "from braket.circuits import Circuit, circuit, noises, Gate, Instruction\n", + "from braket.circuits import Circuit, circuit, noises\n", "from braket.devices import LocalSimulator\n", - "import braket.simulator_v2\n", "\n", "default_simulator = LocalSimulator(\"braket_sv\")\n", - "new_sv_simulator = LocalSimulator(\"braket_sv_v2\")\n", + "new_sv_simulator = LocalSimulator(\"braket_sv_v2\")\n", "default_dm_simulator = LocalSimulator(\"braket_dm\")\n", - "new_dm_simulator = LocalSimulator(\"braket_dm_v2\")\n", + "new_dm_simulator = LocalSimulator(\"braket_dm_v2\")\n", "\n", "n_shots = 100" ] @@ -76,11 +74,11 @@ "outputs": [], "source": [ "@circuit.subroutine(register=True)\n", - "def qft(qubits): \n", + "def qft(qubits):\n", " \"\"\"\n", " Construct a circuit object corresponding to the Quantum Fourier Transform (QFT)\n", " algorithm, applied to the argument qubits. Does not use recursion to generate the QFT.\n", - " \n", + "\n", " Args:\n", " qubits (int): The list of qubits on which to apply the QFT\n", " \"\"\"\n", @@ -88,21 +86,21 @@ "\n", " # get number of qubits\n", " num_qubits = len(qubits)\n", - " \n", + "\n", " for k in range(num_qubits):\n", " # First add a Hadamard gate\n", " qftcirc.h(qubits[k])\n", - " \n", + "\n", " # Then apply the controlled rotations, with weights (angles) defined by the distance to the control qubit.\n", " # Start on the qubit after qubit k, and iterate until the end. When num_qubits==1, this loop does not run.\n", - " for j in range(1,num_qubits - k):\n", - " angle = 2*math.pi/(2**(j+1))\n", - " qftcirc.cphaseshift(qubits[k+j],qubits[k], angle)\n", - " \n", + " for j in range(1, num_qubits - k):\n", + " angle = 2 * math.pi / (2 ** (j + 1))\n", + " qftcirc.cphaseshift(qubits[k + j], qubits[k], angle)\n", + "\n", " # Then add SWAP gates to reverse the order of the qubits:\n", - " for i in range(math.floor(num_qubits/2)):\n", - " qftcirc.swap(qubits[i], qubits[-i-1])\n", - " \n", + " for i in range(math.floor(num_qubits / 2)):\n", + " qftcirc.swap(qubits[i], qubits[-i - 1])\n", + "\n", " return qftcirc" ] }, @@ -143,7 +141,7 @@ ], "source": [ "qubit_range = range(5, 21, 5)\n", - "qft_circs = {}\n", + "qft_circs = {}\n", "old_results = {}\n", "new_results = {}\n", "old_durations = {}\n", @@ -153,18 +151,18 @@ " qft_circ = qft(range(num_qubits))\n", " old_start = time.time()\n", " old_results[num_qubits] = default_simulator.run(qft_circ, shots=n_shots).result()\n", - " old_stop = time.time()\n", + " old_stop = time.time()\n", " old_durations[num_qubits] = old_stop - old_start\n", " new_start = time.time()\n", " new_results[num_qubits] = new_sv_simulator.run(qft_circ, shots=n_shots).result()\n", - " new_stop = time.time()\n", + " new_stop = time.time()\n", " new_durations[num_qubits] = new_stop - new_start\n", " qft_circs[num_qubits] = qft_circ\n", "\n", "for num_qubits in qubit_range:\n", " print(f\"QFT circuit with {num_qubits} qubits:\")\n", - " print(f'Old local simulator runtime: {old_durations[num_qubits]}')\n", - " print(f'New local simulator runtime: {new_durations[num_qubits]}')\n", + " print(f\"Old local simulator runtime: {old_durations[num_qubits]}\")\n", + " print(f\"New local simulator runtime: {new_durations[num_qubits]}\")\n", " print()" ] }, @@ -208,11 +206,11 @@ } ], "source": [ - "bit_flip = noises.BitFlip(probability=0.1)\n", + "bit_flip = noises.BitFlip(probability=0.1)\n", "phase_flip = noises.PhaseFlip(probability=0.15)\n", "\n", "qubit_range = range(2, 9, 2)\n", - "qft_circs = {}\n", + "qft_circs = {}\n", "old_results = {}\n", "new_results = {}\n", "old_durations = {}\n", @@ -222,21 +220,21 @@ " qft_circ = qft(range(num_qubits))\n", " qft_circ.apply_gate_noise(bit_flip)\n", " qft_circ.apply_gate_noise(phase_flip)\n", - " \n", + "\n", " old_start = time.time()\n", " old_results[num_qubits] = default_dm_simulator.run(qft_circ, shots=n_shots).result()\n", - " old_stop = time.time()\n", + " old_stop = time.time()\n", " old_durations[num_qubits] = old_stop - old_start\n", " new_start = time.time()\n", " new_results[num_qubits] = new_dm_simulator.run(qft_circ, shots=n_shots).result()\n", - " new_stop = time.time()\n", + " new_stop = time.time()\n", " new_durations[num_qubits] = new_stop - new_start\n", " qft_circs[num_qubits] = qft_circ\n", "\n", "for num_qubits in qubit_range:\n", " print(f\"Noisy QFT circuit with {num_qubits} qubits:\")\n", - " print(f'Old noise local simulator runtime: {old_durations[num_qubits]}')\n", - " print(f'New noise local simulator runtime: {new_durations[num_qubits]}')\n", + " print(f\"Old noise local simulator runtime: {old_durations[num_qubits]}\")\n", + " print(f\"New noise local simulator runtime: {new_durations[num_qubits]}\")\n", " print()" ] }, @@ -277,7 +275,7 @@ ], "source": [ "qubit_range = range(5, 16, 5)\n", - "qft_circs = {}\n", + "qft_circs = {}\n", "old_results = {}\n", "new_results = {}\n", "old_durations = {}\n", @@ -291,18 +289,20 @@ " old_start = time.time()\n", " batch_circs = [qft_circ for c_ix in range(batch_size)]\n", " old_results[num_qubits] = default_simulator.run_batch(batch_circs, shots=n_shots).results()\n", - " old_stop = time.time()\n", + " old_stop = time.time()\n", " old_durations[num_qubits] = old_stop - old_start\n", " new_start = time.time()\n", - " new_results[num_qubits] = new_sv_simulator.run_batch(batch_circs, shots=n_shots, max_parallel=2).results()\n", - " new_stop = time.time()\n", + " new_results[num_qubits] = new_sv_simulator.run_batch(\n", + " batch_circs, shots=n_shots, max_parallel=2\n", + " ).results()\n", + " new_stop = time.time()\n", " new_durations[num_qubits] = new_stop - new_start\n", " qft_circs[num_qubits] = qft_circ\n", "\n", "for num_qubits in qubit_range:\n", " print(f\"{batch_size} QFT circuits with {num_qubits} qubits:\")\n", - " print(f'Old local simulator runtime: {old_durations[num_qubits]}')\n", - " print(f'New local simulator runtime: {new_durations[num_qubits]}')\n", + " print(f\"Old local simulator runtime: {old_durations[num_qubits]}\")\n", + " print(f\"New local simulator runtime: {new_durations[num_qubits]}\")\n", " print()" ] }, diff --git a/examples/braket_features/Using_the_tensor_network_simulator_TN1.ipynb b/examples/braket_features/Using_the_tensor_network_simulator_TN1.ipynb index 5494b57c7..e4a536319 100644 --- a/examples/braket_features/Using_the_tensor_network_simulator_TN1.ipynb +++ b/examples/braket_features/Using_the_tensor_network_simulator_TN1.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -82,13 +83,14 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", "import math\n", "\n", - "import boto3\n", - "# AWS imports: Import Braket SDK modules\n", - "from braket.circuits import Circuit, circuit, Gate, Instruction\n", + "import numpy as np\n", + "\n", "from braket.aws import AwsDevice\n", + "\n", + "# AWS imports: Import Braket SDK modules\n", + "from braket.circuits import Circuit, Gate, Instruction, circuit\n", "from braket.devices import Devices\n", "\n", "tn_device = AwsDevice(Devices.Amazon.TN1)\n", @@ -125,11 +127,11 @@ " :rtype: Circuit\n", " \"\"\"\n", "\n", - " circuit = Circuit() # instantiate circuit object\n", - " circuit.h(0) # add Hadamard gate on first qubit\n", + " circuit = Circuit() # instantiate circuit object\n", + " circuit.h(0) # add Hadamard gate on first qubit\n", "\n", - " for ii in range(0, n_qubits-1):\n", - " circuit.cnot(control=ii, target=ii+1) # apply series of CNOT gates\n", + " for ii in range(0, n_qubits - 1):\n", + " circuit.cnot(control=ii, target=ii + 1) # apply series of CNOT gates\n", " return circuit" ] }, @@ -377,12 +379,12 @@ "source": [ "qubit_range = range(20, 31, 5)\n", "tn_qubit_range = range(35, 51, 5)\n", - "n_shots = 50\n", - "ghz_circs = {}\n", - "sv_tasks = {}\n", - "tn_tasks = {}\n", - "sv_results = {}\n", - "tn_results = {}\n", + "n_shots = 50\n", + "ghz_circs = {}\n", + "sv_tasks = {}\n", + "tn_tasks = {}\n", + "sv_results = {}\n", + "tn_results = {}\n", "for num_qubits in qubit_range:\n", " ghz = ghz_circuit(num_qubits)\n", " sv_tasks[num_qubits] = sv_device.run(ghz, shots=n_shots)\n", @@ -398,9 +400,9 @@ "for num_qubits in qubit_range:\n", " tn_status = tn_tasks[num_qubits].state()\n", " sv_status = sv_tasks[num_qubits].state()\n", - " while tn_status != 'COMPLETED':\n", + " while tn_status != \"COMPLETED\":\n", " tn_status = tn_tasks[num_qubits].state()\n", - " while sv_status != 'COMPLETED':\n", + " while sv_status != \"COMPLETED\":\n", " sv_status = sv_tasks[num_qubits].state()\n", "\n", " tn_results[num_qubits] = tn_tasks[num_qubits].result()\n", @@ -417,21 +419,29 @@ " # get the measurement counts\n", " tn_counts = tn_results[num_qubits].measurement_counts\n", " sv_counts = sv_results[num_qubits].measurement_counts\n", - " \n", + "\n", " print(\"GHZ circuit:\")\n", " print(ghz_circs[num_qubits])\n", - " print('{}-qubit TN1 task {}.'.format(num_qubits,tn_status))\n", - " print('Tensor network simulator:')\n", - " print('This quantum task ran {} shots and the total runtime was {} ms'.format(tn_num_shots,tn_runtime))\n", + " print(\"{}-qubit TN1 task {}.\".format(num_qubits, tn_status))\n", + " print(\"Tensor network simulator:\")\n", + " print(\n", + " \"This quantum task ran {} shots and the total runtime was {} ms\".format(\n", + " tn_num_shots, tn_runtime\n", + " )\n", + " )\n", " print(\"Measurement results: {}\\n\".format(tn_counts))\n", - " print('{}-qubit SV1 task {}.'.format(num_qubits,sv_status))\n", - " print('State vector simulator:')\n", - " print('This quantum task ran {} shots and the total runtime was {} ms'.format(sv_num_shots,sv_runtime))\n", + " print(\"{}-qubit SV1 task {}.\".format(num_qubits, sv_status))\n", + " print(\"State vector simulator:\")\n", + " print(\n", + " \"This quantum task ran {} shots and the total runtime was {} ms\".format(\n", + " sv_num_shots, sv_runtime\n", + " )\n", + " )\n", " print(\"Measurement results: {}\\n\".format(sv_counts))\n", "\n", "for num_qubits in tn_qubit_range:\n", " tn_status = tn_tasks[num_qubits].state()\n", - " while tn_status != 'COMPLETED':\n", + " while tn_status != \"COMPLETED\":\n", " tn_status = tn_tasks[num_qubits].state()\n", "\n", " tn_results[num_qubits] = tn_tasks[num_qubits].result()\n", @@ -444,11 +454,15 @@ "\n", " # get the measurement counts\n", " tn_counts = tn_results[num_qubits].measurement_counts\n", - " \n", + "\n", " # we will not print the circuits here as they are quite large\n", - " print('{}-qubit TN1 task {}.'.format(num_qubits,tn_status))\n", - " print('Tensor network simulator:')\n", - " print('This quantum task ran {} shots and the total runtime was {} ms'.format(tn_num_shots,tn_runtime))\n", + " print(\"{}-qubit TN1 task {}.\".format(num_qubits, tn_status))\n", + " print(\"Tensor network simulator:\")\n", + " print(\n", + " \"This quantum task ran {} shots and the total runtime was {} ms\".format(\n", + " tn_num_shots, tn_runtime\n", + " )\n", + " )\n", " print(\"Measurement results: {}\\n\".format(tn_counts))" ] }, @@ -471,11 +485,11 @@ "outputs": [], "source": [ "@circuit.subroutine(register=True)\n", - "def qft(qubits): \n", + "def qft(qubits):\n", " \"\"\"\n", " Construct a circuit object corresponding to the Quantum Fourier Transform (QFT)\n", " algorithm, applied to the argument qubits. Does not use recursion to generate the QFT.\n", - " \n", + "\n", " Args:\n", " qubits (int): The list of qubits on which to apply the QFT\n", " \"\"\"\n", @@ -483,21 +497,21 @@ "\n", " # get number of qubits\n", " num_qubits = len(qubits)\n", - " \n", + "\n", " for k in range(num_qubits):\n", " # First add a Hadamard gate\n", " qftcirc.h(qubits[k])\n", - " \n", + "\n", " # Then apply the controlled rotations, with weights (angles) defined by the distance to the control qubit.\n", " # Start on the qubit after qubit k, and iterate until the end. When num_qubits==1, this loop does not run.\n", - " for j in range(1,num_qubits - k):\n", - " angle = 2*math.pi/(2**(j+1))\n", - " qftcirc.cphaseshift(qubits[k+j],qubits[k], angle)\n", - " \n", + " for j in range(1, num_qubits - k):\n", + " angle = 2 * math.pi / (2 ** (j + 1))\n", + " qftcirc.cphaseshift(qubits[k + j], qubits[k], angle)\n", + "\n", " # Then add SWAP gates to reverse the order of the qubits:\n", - " for i in range(math.floor(num_qubits/2)):\n", - " qftcirc.swap(qubits[i], qubits[-i-1])\n", - " \n", + " for i in range(math.floor(num_qubits / 2)):\n", + " qftcirc.swap(qubits[i], qubits[-i - 1])\n", + "\n", " return qftcirc" ] }, @@ -535,8 +549,8 @@ ], "source": [ "qubit_range = range(20, 41, 10)\n", - "tn_tasks = {}\n", - "tn_results = {}\n", + "tn_tasks = {}\n", + "tn_results = {}\n", "for num_qubits in qubit_range:\n", " # generate QFT circuit\n", " qft_circ = qft(range(num_qubits))\n", @@ -544,7 +558,7 @@ "\n", "for num_qubits in qubit_range:\n", " tn_status = tn_tasks[num_qubits].state()\n", - " while tn_status != 'COMPLETED':\n", + " while tn_status != \"COMPLETED\":\n", " tn_status = tn_tasks[num_qubits].state()\n", "\n", " tn_results[num_qubits] = tn_tasks[num_qubits].result()\n", @@ -553,10 +567,14 @@ "\n", " # get the measurement counts\n", " tn_counts = tn_results[num_qubits].measurement_counts\n", - " \n", - " print('{}-qubit task {}.'.format(num_qubits,tn_status))\n", - " print('QFT:')\n", - " print('This quantum task ran {} shots and the total runtime was {} ms'.format(tn_num_shots,tn_runtime))\n", + "\n", + " print(\"{}-qubit task {}.\".format(num_qubits, tn_status))\n", + " print(\"QFT:\")\n", + " print(\n", + " \"This quantum task ran {} shots and the total runtime was {} ms\".format(\n", + " tn_num_shots, tn_runtime\n", + " )\n", + " )\n", " print(\"Measurement results: {}\\n\".format(tn_counts))" ] }, @@ -603,13 +621,15 @@ " for i in range(num_gates):\n", " if np.random.random_sample() > 0.5:\n", " \"\"\"CZ between a random qubit and the next qubit to its left.\"\"\"\n", - " a = np.random.choice(range(len(qubits)-1), 1, replace=True)[0]\n", - " hp_circ.cz(qubits[a],qubits[a+1])\n", + " a = np.random.choice(range(len(qubits) - 1), 1, replace=True)[0]\n", + " hp_circ.cz(qubits[a], qubits[a + 1])\n", " else:\n", " \"\"\"Random single qubit rotation.\"\"\"\n", " angle = np.random.uniform(0, 2 * math.pi)\n", - " qubit = np.random.choice(qubits,1,replace=True)[0]\n", - " gate = np.random.choice([Gate.Rx(angle), Gate.Ry(angle), Gate.Rz(angle), Gate.H()], 1, replace=True)[0]\n", + " qubit = np.random.choice(qubits, 1, replace=True)[0]\n", + " gate = np.random.choice(\n", + " [Gate.Rx(angle), Gate.Ry(angle), Gate.Rz(angle), Gate.H()], 1, replace=True\n", + " )[0]\n", " hp_circ.add_instruction(Instruction(gate, qubit))\n", " return hp_circ" ] @@ -717,7 +737,7 @@ "source": [ "num_qubits = 5\n", "for num_gates in range(5, 26, 5):\n", - " print('')\n", + " print(\"\")\n", " print(f\"HAYDEN PRESKILL CIRCUIT WITH {num_gates} GATES:\")\n", " my_hp_circ = local_Hayden_Preskill(num_qubits, num_gates)\n", " print(my_hp_circ)" @@ -760,11 +780,11 @@ } ], "source": [ - "num_qubits = 20\n", - "n_shots = 5\n", - "gate_range = [250, 500]\n", - "tn_tasks = {}\n", - "tn_results = {}\n", + "num_qubits = 20\n", + "n_shots = 5\n", + "gate_range = [250, 500]\n", + "tn_tasks = {}\n", + "tn_results = {}\n", "for gates in gate_range:\n", " # construct HP circuit\n", " circ = Circuit()\n", @@ -777,7 +797,7 @@ "\n", "for depth in tn_tasks.keys():\n", " tn_status = tn_tasks[depth].state()\n", - " while tn_status != 'COMPLETED':\n", + " while tn_status != \"COMPLETED\":\n", " tn_status = tn_tasks[depth].state()\n", "\n", " tn_results[depth] = tn_tasks[depth].result()\n", @@ -786,10 +806,10 @@ "\n", " # get the measurement counts\n", " tn_counts = tn_results[depth].measurement_counts\n", - " \n", - " print('{}-qubit {}-depth task {}.'.format(num_qubits,depth,tn_status))\n", - " print('Hayden-Preskill circuit:')\n", - " print('This task ran {} shots and the total runtime was {} ms'.format(n_shots,tn_runtime))\n", + "\n", + " print(\"{}-qubit {}-depth task {}.\".format(num_qubits, depth, tn_status))\n", + " print(\"Hayden-Preskill circuit:\")\n", + " print(\"This task ran {} shots and the total runtime was {} ms\".format(n_shots, tn_runtime))\n", " print(\"Measurement results: {}\\n\".format(tn_counts))" ] }, @@ -838,47 +858,47 @@ "num_qubits = 25\n", "ghz_circ = ghz_circuit(num_qubits)\n", "qft_circ = qft(range(num_qubits))\n", - "hp_circ = Circuit()\n", + "hp_circ = Circuit()\n", "for _i in range(10):\n", " circ = local_Hayden_Preskill(num_qubits, 500)\n", " if circ.depth <= 100:\n", " hp_circ = circ\n", " break\n", - "ghz_tasks = {}\n", - "ghz_results = {}\n", - "qft_tasks = {}\n", - "qft_results = {}\n", - "hp_tasks = {}\n", - "hp_results = {}\n", + "ghz_tasks = {}\n", + "ghz_results = {}\n", + "qft_tasks = {}\n", + "qft_results = {}\n", + "hp_tasks = {}\n", + "hp_results = {}\n", "for n_shots in [5, 20]:\n", " ghz_tasks[n_shots] = tn_device.run(ghz_circ, shots=n_shots)\n", " qft_tasks[n_shots] = tn_device.run(qft_circ, shots=n_shots)\n", - " hp_tasks[n_shots] = tn_device.run(hp_circ, shots=n_shots)\n", + " hp_tasks[n_shots] = tn_device.run(hp_circ, shots=n_shots)\n", "\n", "for n_shots in [5, 20]:\n", " ghz_status = ghz_tasks[n_shots].state()\n", - " while ghz_status != 'COMPLETED':\n", + " while ghz_status != \"COMPLETED\":\n", " ghz_status = ghz_tasks[n_shots].state()\n", "\n", " qft_status = qft_tasks[n_shots].state()\n", - " while qft_status != 'COMPLETED':\n", + " while qft_status != \"COMPLETED\":\n", " qft_status = qft_tasks[n_shots].state()\n", "\n", - " hp_status = hp_tasks[n_shots].state()\n", - " while hp_status != 'COMPLETED':\n", + " hp_status = hp_tasks[n_shots].state()\n", + " while hp_status != \"COMPLETED\":\n", " hp_status = hp_tasks[n_shots].state()\n", "\n", " ghz_results[n_shots] = ghz_tasks[n_shots].result()\n", " qft_results[n_shots] = qft_tasks[n_shots].result()\n", - " hp_results[n_shots] = hp_tasks[n_shots].result()\n", + " hp_results[n_shots] = hp_tasks[n_shots].result()\n", " # get the running time of the task\n", " ghz_runtime = ghz_results[n_shots].additional_metadata.simulatorMetadata.executionDuration\n", " qft_runtime = qft_results[n_shots].additional_metadata.simulatorMetadata.executionDuration\n", - " hp_runtime = hp_results[n_shots].additional_metadata.simulatorMetadata.executionDuration\n", + " hp_runtime = hp_results[n_shots].additional_metadata.simulatorMetadata.executionDuration\n", "\n", - " print('GHZ task ran {} shots and the total runtime was {} ms'.format(n_shots,ghz_runtime))\n", - " print('QFT task ran {} shots and the total runtime was {} ms'.format(n_shots,qft_runtime))\n", - " print('HP task ran {} shots and the total runtime was {} ms'.format(n_shots,hp_runtime))" + " print(\"GHZ task ran {} shots and the total runtime was {} ms\".format(n_shots, ghz_runtime))\n", + " print(\"QFT task ran {} shots and the total runtime was {} ms\".format(n_shots, qft_runtime))\n", + " print(\"HP task ran {} shots and the total runtime was {} ms\".format(n_shots, hp_runtime))" ] }, { @@ -905,8 +925,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/braket_features/Verbatim_Compilation.ipynb b/examples/braket_features/Verbatim_Compilation.ipynb index 0ef75f7b1..c46259df2 100644 --- a/examples/braket_features/Verbatim_Compilation.ipynb +++ b/examples/braket_features/Verbatim_Compilation.ipynb @@ -1,948 +1,973 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Verbatim compilation" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", - "from braket.tracking import Tracker\n", - "t = Tracker().start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Usually, when you run a circuit on a QPU, behind the scenes, Amazon Braket will do a series of compilation steps to optimize your circuit and map the abstract circuit to the physical qubits on the QPU. However, in many situations, such as for error mitigation or benchmarking experiments, researchers require full control of the qubits and the gates that are being applied. In a [previous notebook](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Allocating_Qubits_on_QPU_Devices.ipynb), we showed you how to manually allocate the qubits of your circuit, i.e., how you can exactly define which logical qubit maps to which physical qubit. In this notebook, you will learn how to use _verbatim compilation_ to run your circuits exactly as defined without any modification during the compilation process.\n", - "\n", - "### Table of contents:\n", - "\n", - "* [Recap: Running circuits on Amazon Braket](#Recap)\n", - "* [Using verbatim compilation to run circuits without further compilation](#Verbatim)\n", - "* [Programming verbatim circuits onto the Rigetti device](#Rigetti)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Recap: Running circuits on Amazon Braket " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us begin with importing the usual dependencies. Verbatim compilation is supported by all Rigetti devices, and we will use the Ankaa-2 device for this demonstration." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# general imports\n", - "from braket.aws import AwsDevice\n", - "from braket.circuits import Circuit\n", - "from braket.devices import Devices\n", - "from math import pi\n", - "import networkx as nx\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you run a circuit on Amazon Braket, different compilation and optimization steps occur before the circuit is executed on the selected QPU. First, the gates of your circuit are decomposed into the _native gates_ of the QPU. Let's first remember what the native gates of the Ankaa-2 device are:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The native gates for the Ankaa-2 device are:\n", - "rx\n", - "rz\n", - "cz\n", - "iswap\n" - ] - } - ], - "source": [ - "# set up the Rigetti Ankaa-2 device\n", - "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "\n", - "# list the native gate set\n", - "print(\"The native gates for the\", device.name, \"device are:\")\n", - "for gate in device.properties.paradigm.nativeGateSet:\n", - " print(gate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we create a circuit with gates that are not part of that list, the gates will automatically be decomposed into a gate set that can be executed on the device." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │\n", - " ┌───┐ \n", - "q0 : ─┤ H ├───●───\n", - " └───┘ │ \n", - " ┌─┴─┐ \n", - "q1 : ───────┤ X ├─\n", - " └───┘ \n", - "T : │ 0 │ 1 │\n", - "Counter({'00': 482, '11': 423, '10': 54, '01': 41})\n" - ] - } - ], - "source": [ - "bell = Circuit().h(0).cnot(0,1)\n", - "print(bell)\n", - "result = device.run(bell, shots=1000).result()\n", - "print(result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's have a look at the circuit that was actually executed. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[2]\n", - "PRAGMA PRESERVE_BLOCK\n", - "RX(1.5707963267948966) 76\n", - "RZ(3.141592653589793) 76\n", - "ISWAP 76 75\n", - "RZ(1.5707963267948966) 76\n", - "RX(1.5707963267948966) 76\n", - "RZ(4.71238898038469) 76\n", - "ISWAP 76 75\n", - "RZ(3.141592653589793) 75\n", - "RX(1.5707963267948966) 75\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 76 ro[0]\n", - "MEASURE 75 ro[1]\n" - ] - } - ], - "source": [ - "meta = result.additional_metadata.rigettiMetadata\n", - "print(meta.compiledProgram)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, the original gates, `h` and `cnot`, were decomposed into the native `rz`, `rx`, and `iswap`. You will also note that the abstract qubit indices 0 and 1 (which were chosen as an example) were remapped to qubits that actually exist on the device, in this case, 5 and 6, respectively. At the time when you run this notebook, you might see a different remapping, as the compiler takes into account the latest calibration of the device and tries to map to the qubits that yield the best results. \n", - "\n", - "The compiler further performs circuit optimizations to minimize the number of operations, e.g., by removing redundant gates. Let's have a look at a single-qubit circuit containing two subsequent `x` gates:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "identity = Circuit().x(0).x(0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course, if you do the math, two consecutive `x` gates just cancel each other out, and we are left with an empty circuit after compilation." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[1]\n", - "PRAGMA PRESERVE_BLOCK\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 0 ro[0]\n", - "Counter({'0': 918, '1': 82})\n" - ] - } - ], - "source": [ - "result = device.run(identity, shots=1000).result()\n", - "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", - "print(compiled_program)\n", - "print(result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Using verbatim compilation to run circuits without further compilation " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In some cases, however, you may need to run circuits exactly as defined, without any further modifications by the compiler. For instance, if you want to benchmark device performance you may want to control exactly which gates are executed on the hardware. Similarly, [certain error mitigation protocols](https://arxiv.org/pdf/2005.10921.pdf) require insertion of additional, redundant operations that would normally be removed by the compiler but are essential for the protocol to work. To prevent circuits (or parts of circuits) from further compiler optimizations, you can use the `add_verbatim_box` function in the Amazon Braket SDK." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Note: add_verbatim_box is currently supported on Rigetti, IonQ, and IQM devices.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you define a (sub-)circuit in a verbatim box, you need to make sure that everything inside the verbatim box can be executed on the device _exactly_ as you defined it. This means that\n", - "1. The circuit can only use qubit indices that exist on the device\n", - "2. All gates of the circuit have to be part of the native gate set of the device\n", - "3. All multi-qubit gates have to be between qubits that are connected according to the connectivity graph of the device " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting started with a minimal example\n", - "Let's have a look at the simple example from before of an identify circuit. " - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "identity = Circuit().rx(0,pi).rx(0,pi)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here, we have chosen the Rigetti-native `rx` gate, which is identical to `x` if we choose the angle to be $\\pi$. Next, we wrap this circuit in a verbatim box to prevent the compiler from collapsing the two gates. You can see the circuit diagram indicates the start and end of the verbatim box." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │ 3 │\n", - " ┌──────────┐ ┌──────────┐ \n", - "q0 : ───StartVerbatim───┤ Rx(3.14) ├─┤ Rx(3.14) ├───EndVerbatim───\n", - " └──────────┘ └──────────┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │\n" - ] - } - ], - "source": [ - "circ = Circuit().add_verbatim_box(identity)\n", - "print(circ)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When we run the circuit, both gates will be executed on the device." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Note: To run a circuit that contains a verbatim box the disable_qubit_rewiring flag must be set to True \n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[1]\n", - "PRAGMA PRESERVE_BLOCK\n", - "RX(3.141592653589793) 0\n", - "RX(3.141592653589793) 0\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 0 ro[0]\n", - "Counter({'0': 909, '1': 91})\n" - ] - } - ], - "source": [ - "result = device.run(circ, shots=1000, disable_qubit_rewiring=True).result()\n", - "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", - "print(compiled_program)\n", - "print(result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Programming verbatim circuits onto the Rigetti device " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we have mentioned above, to build circuits with multi-qubit gates, you need to take into consideration the connectivity graph of the device. When a circuit contains a verbatim box, automatic qubit rewiring has to be disables, and you have manually allocate the qubits on the device that you want to use for your circuit.\n", - "You can access the connectivity graph on the [device detail page](https://console.aws.amazon.com/braket/home?region=us-west-1#/devices/arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2) in the Amazon Braket Console, or by using the code below." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3jTZduGz4yme+89GGVPkY0gS0ABwQECoogiCiKKAvqqoOIAFBUEZAkqguNzASpDBNmC7A3ddO89k3x/lISmSdp0QNvkOY+D47W/lSd5M+7f81zXdUvUarUagUAgEAgEAoGglkgbegACgUAgEAgEgqaNKCgFAoFAIBAIBHVCFJQCgUAgEAgEgjohCkqBQCAQCAQCQZ0QBaVAIBAIBAKBoE6IglIgEAgEAoFAUCdEQSkQCAQCgUAgqBOioBQIBAKBQCAQ1AlRUAoEAoFAIBAI6oQoKAUCgUAgEAgEdUIUlAKBQCAQCASCOiEKSoFAIBAIBAJBnRAFpUAgEAgEAoGgToiCUiAQCAQCgUBQJ0RBKRAIBAKBQCCoE6KgFAgEAoFAIBDUCVFQCgQCgUAgEAjqhCgoBQKBQCAQCAR1QhSUAoFAIBAIBII6IQpKgUAgEAgEAkGdEAWlQCAQCAQCgaBOiIJSIBAIBAKBQFAnREEpEAgEAoFAIKgToqAUCAQCgUAgENQJUVAKBAKBQCAQCOqEKCgFAoFAIBAIBHVCFJQCgUAgEAgEgjohCkqBQCAQCAQCQZ0QBaVAIBAIBAKBoE6IglIgEAgEAoFAUCdEQSkQCAQCgUAgqBOioBQIBAKBQCAQ1AlRUAoEAoFAIBAI6oQoKAUCgUAgEAgEdUIUlAKBQCAQCASCOiEKSoFAIBAIBAJBnRAFpUAgEAgEAoGgTsgbegACyya/uIzo9HxKylQo5FJC3O2xtxZvS4FAIBAImhLil1twx7mWnMvmY7H8fSWF2IwC1BX2SYAgNzsGhHsxoXsQLbwdG2qYAoFAIBAITESiVqvV1R8mENSduIwCXvv5HAeupyGTSlCqjL/1NPv7NvfgvQfbE+hmdwdHKhAIBAKBoCaIglJwR9h6PJa3frtAmUpdZSFZGZlUglwqYeHItozrFnQbRygQCAQCgaC2iIJScNtZ8fc1lu66WufrzBnSkhkDWtTDiAQCgUAgENQnQkMpuK1sPR5bL8UkwNJdV/F0sOZRM5+pFEYlgUAgEDQ1xAyl4LYRl1HAoGX7KS5TGT2mrZ8TLw5sSbcQV6zlMmIzCthyPJaNh6MNHm8tl7Jn9j1mp6kURiWBQCAQNGVEQSm4bUxaf4zDkelGNZN9W3iw7vG7uJiQw/azieSXlBHsZodEIuGDPy8bPEcmldArzJ2vn+p+O4d+xxBGJYFAIBCYA6KgFNwWriXnMviTf4zud7CW8/fL9/BfTBbTv/2Pmr4L98zuR3Ovpj1TJ4xKtUNIAgQCgaDxIb6FBbeFzcdiq5xxG9XRD09HG5bsuoJaDbZWMorKlCYVljKphG+OxrJgZNt6HvWdoy5GJeXNAnTeT+dIyyu2CKOSkAQIBAJB40YUlILbwt9XUqqcdevd3IOcolJ8nKxZM6krzTwdyC8u4+dT8byz42KVukulSs3fV1NYgH5BGRcXx7Fjxxg7diwSiaRenkt9I4xKpmOKJEANxGQU8PWxGDYeiRaSAIFAIGgAxJK3oN7JKy6j/YKdVPXG+uOFvgS7l//gf3cijqORGfQIc+PJXqH8diaeF7aervIxJMD5BUOxt5ajUqnYs2cPn3/+Odu2bUOtVhMVFUVISEh9PaV6oyqjUo9QN7Y+09PgeQ+uPMSpuCyD+8zVqCQkAQKBQNB0EDOUgnonJj2/ymISwE4hw04h55ujMSzcdhGAnReSUMikTOgezMe7rxKdXmD0fDXw17GzXDy8iy+++ILo6GhkMhma+yMHB4d6ejY1Iz4+Hn9/f6P7X/v5HGXVFEdfHorizI1snW3R6flGjy9TqXnt53NmY1QCIQkQCASCpoYoKAX1TkkVy9UaikrLj/ntTILO9l9PJzChezBdglyrLCgBHh43npLEW0WHUqnU/vc999yDq6srHh4eeHl54ePjQ0BAAIGBgYSEhBAaGoqNjU1Nnla1HD58mN69e/PAAw/w6aefEhoaqrP/WnIuB66nVXudf6Mz+ON8ksmPq1SpOXA9jespuU3eqARCEiAQCARNEVFQCuodhVxa7THJuUWE+ziSllessz09v/xvZ1uraq/x0JjR/Lrxc/Lz9WfvoqKiuHLlik6RaQi5XI5CocDW1hZ7e3ucnZ1xcXExWIiGhYURHByMQqEweK3o6GgAfv/9d/7880/mz5/P3LlzsbMrX4quzqhUEXuFjKIylclLveZgVIJyScBbv10w+fjn+zfnlaHhXEnKZeinhlMF3vztAr2aeZidJMAYwgUvEAgaAvEtI6h3QtztkUCVy97n47Pp18ITbycbItNuFYRejuWzhun5JVU+hgRY89Ei1i9dyNKlS3n33XcpKytDqVQSGBhIbGys9ticnBwiIyOJiYkhNjaWhIQEkpKSSElJISMjg6ysLHJzc8nJySElJYWSkhJUKuOzrBKJBJlMhrW1tU4hWlBQPqOqVCpRKpW88847rFy5knfffZepU6dWa1TSsOShjjhYyylTqjgencl7f1ziXHx2lecYMypdunSJjz/+mO3bt3P06FGCg4OrffyGxBRJgAYfJxueH9CM/OKyKo8zR0lAZYQLXiAQNDTClCO4Ldyz5G9iMowvWbf1dWLHC3355XQ8L353Wrv900c7Mby9L70/3EtKbrHR84Pd7dg/Z4D275iYGGbPns3PP/9Mly5d+O+//+r8HDIyMrSFaFxcnLYQTU1N1SlECwoKKCoqoqSkBGMfJ4nClqDZ30MVzvMuQa5M7RPK31dSyCwooYWXI0/3DcNOIWPsqsNcSMypcrwao5KdQsbevXtZsmQJO3fuRCKRoFarOX78OHfddVddXpI6UVhYyJYtWxg7dizOzs56+6vLLq3M8nGdcbNXIJNKcLVTGJ2h1GAO2aWVEcH4AoGgsSAKSsFtYcFvF/j6WEyVP3AfjunAo90C2X42gaNRGfQIdeP+Dn58/vd1luy6YvQ8mVTCpO7BBpd39+/fj42NDd273/nZqBdeeIFVq1ZRVlaGVCpFpVJhb29Px44d6TtyPFuzQqu/SCWC3e3484V+/BudzuQvj1d7fNiV7zi++2fy8vK0haSGTz75hI4dO2qX893d3ZHJZDUeU2359ddfGT16NC4uLrzzzjtMmzYNK6tb0gZT3jMa7g5x49up3Rmx/CALR7attqCs6j3TVBEueIFA0JgQS96C28KE7kFsPBJd5TGv/3KOhOxCHu4awJA2PsRnFfL29gtsOFT1eUqVmok9DP8Q3nPPPbUccd3JyMigrKx8+bV3797MmDGD0aNHo1AoOBWbydZVh2t8zZj0AnZfSmJoWx+kEqiubjh6/ASFeXkAerOlL774osFzNEv4crlcqylVKBTY2NhgY2ODnZ0d9vb22Nvb4+joiJOTE05OTri4uODq6oqbmxtubm54eHjg6emJl5eXVjdakZyc8hnWrKwsZs6cybJly/j4448ZOXIkEonEZEmAVAILR7bluxNxXEnOrfZ4qDq7tCkiXPACgaCxIQpKwW2hhbcjfZt7VNnLu0yl5tO/rvHpX9dMvq6ml3djXLocO3Ysnp6ePP3007Rp00ZnnylGJWMkZBVhLS+PWcqrRi/475HD/PfXr7z66qukpKTo7Pvkk08oKSkhKyuL7OxscnJyyM3NJTc3l/z8fAoKCigsLKSoqIiioiIyMzMpLS3ValNVKpXRJX1DSCQSpFKptlitrEuNjIxk9OjRODs7M2nK08RY9zfpuhO6B+PvYsuE9cdMHgtAbHoB+cVlWoOKWq3myJEjfPHFF/z888/8+uuvDBgwoJqrNDzCBS8QCBojoqAU3Dbee7A9g5btr9FyXHXIpRLee7B9vV2vPnnwwQd58MEHDe4zxahkjCA3O4pKleSXVF1MSoBQTwfaTZ7Mww8/zMcff8yiRYsoKioC4Nlnn8Xa2roWI9ClsLCQlJQUUlNTSU9PJy0tjczMTDIzM8nKyiInJ0dbrObn52uL1aSkJO1YKpKdnc36737F6/H+1T62i50VLw1uyWd7r5FRjXGrMmrK8zz9bFV88803rFy5ksuXLyOTyVAqldoZ1MZMVS74Fl4OvDioJe39nfF0sKawVMm1lFzW/BPJX5dTDJ4DwgUvXPACQf0gPkWC20agmx0LR7Zl3k/n6u2ab49s2yR/+Oyt5QS52VVpVHKzV+gVSa19HBnU2pv9V1Oq7XMe5G6n/WG0s7Pjf//7H1OnTuWNN97g8uXLRuOOaoqtrS3BwcE1dowvWLCAd999F6VSiVQqRaFQMHXqVF588UVyrNx40ARJwJzB4WQVlLKpGjmFMQYMHEzqZV0tqiZa6vTp0/j5+REeHo6Tk1Otrl9XkpKS8PLyQio1PKNdlQve39UWB2sZ/3fyBsk5RdhaybivnQ/rJ3dj/k9n2XI8zuB5wgUvXPACQX0gCkrBbWVctyDS8orrZYnulSHhTXppbkC4V5WmkxXjO1NUquK/mEzS84tp4eXA+LuDKCpV8sGfxk1KUC4FGNDSS2+7j48Pa9eurZfx15WSkhKUSiXe3t689NJLPP3007i6ugJwIaHqWCSAEHc7xt8dxNvbL+LteCuU3louRS6TEOBiS25xGdmFpUav4exoT6qRfQsWLGDBggXav+VyOTY2Njg4OODk5IS7uzteXl74+voSGBhIaGgozZs3r7cCNCMjg6CgIDp27MiaNWvo3Lmzzv7qgvH3XUll3xXdZ7fpSDTbZ/Rhap8wowWluQXjV0T0ghcI7hzC5S24I9TVkfr2yLZNupiE6mNxnugVwuhOfgS72+NgLScjv4RDEWl8+tc1YqrpGgSNPxYnLi6OU6dOMWzYMB13N5QvQ7arpv97Vb3ONWw4FMXb2y8a3KeJVYqLus706dPZt2+fjhN+9erVJCcnc+PGDRISErTxUDk5OeTn51NcXKw1XRnCysoKa2trvQLUz89PpwBt1aqVwdagZ8+epWPHjkilUtRqNc8//zzvvvuuNmKpJi74iqx7/C46BjjT7b2/jB4jXPC3EC54gaB2iIJScMeIyyhgxqZDnEkpQYoaFcYzGc01M2/S+mNVGpVqg8ao1NSXLKvLLnW1s6JbiJve9pcHh2NvLePt7ReJSS8w6vyumF2qVqv57rvvmDlzJmlpacjlckpKSpBUkROqIS0tjStXrnD9+nWio6O5ceMGiYmJ2qD8nJwcbTZpVZ2arKyssLGx0Qbjy2QyLl68VQxLJBKcnZ356KOPePLJJ+m/dF+Vr48GWysZNlZSHG2sGNzam/nDWrH9XKJO3mt1r09Tpy4u+IrMGdJSuOAFAhMRBaXgtpOZmQlAUVERzZs3p9TWnZdW/cyRmBxi0w3omdztGNDSi4k9ghr1jFttiMsoYNCy/RSb0O/cVKzlUvbMvqfJF921nYHb+nSPWudQZmdn89Zbb5GWlsY333xTq3FXR2pqKleuXCEiIoKoqChtAVp5BrSwsNCoi97K1gG/F7ZUGYyvYdHodkzoXq5vVarU/Hkhifk/nSWnqHpT1/kFQ3UMKpcuXWLNmjV8//33rF27luHDh5v+xBuIrcdj61W3/eGY9k1+dcRUhGFJUBfEO0Vw23nooYfYv38/CoWCwsJCKCjgue6efPBwV4v7AhNGJeOYkl1aW4xllzo7O/PJJ5/clsfU4OnpiaenJ3369KnyuM8++4wXX3xRp6iUyWSEhobS/b6xHDShmITyZf/fzyXi7WTDiA6+yCQSk2KrNC74MFcF//d//8eqVas4fPiw1gWfmmpMfdp4qMoF3yHAmbFdAugZ5k6Aqy2ZBaWcis3ko91XiarQ/rUy5u6CF4YlQX1R+3A8gcBENEt/hYWF2m0LFy4kISEBe2s5bf2c6RzkSls/Z7MuJjWM6xbEnCEt6+VaTd2oVBFNdqlMalrhpGHc2qPVzk72be7R6Ge7U1NTtcVkq1at+Oyzz0hNTeXatWu8/Mpck68TkZrPoYh0fjoVz1ObTmBnLWPd491MOve+4fdjb2/PpEmTOHy43HWvWbaPi4sjJiamyj73txOlUmkwdqoiVbngn+3XjGFtfTgUkcbCbRfZ8m8s3UPd2D6jDy299TWtGjQueHMjLqOASeuPMfiTf/j6WAwxlYpJ0DUsDf7kHyatP0acCbILgWUilrwFt5V9+/YxePBgg2aG8ePH8+233zbAqBoHwqikjyVLAg4cOMCWLVuYNGkSPXr00NFzXkjIZsTyg7W67vhugbw/pgP3frSPyCpm4gDku5cQ8d/+aq8plUqxtrbGzs4OJycn3Nzc8PT0xNfXl6CgIEJCQrQGJA8Pj1qNuzIfffQRb7zxBm+//TazZs3SM3ZVZ3rrEuTKufgsSpW3Pmsh7nbsnNWP388nMfv701U+fmM3vdUEYVgyHUtbRasL4lUR3FamTZtmsJh0d3fnvffea4ARNR7GdQuidzMPbayJWqVEIjXeW1tjVOoV5m5WRqWKWLIkoG/fvvTt29fgvroE49tYlb+nHG2q/rqXAGcO7SE28hrPPvss//yjW5y98cYb5ObmcuPGDZKTk0lPTycrK4v09HRu3LhBWVmZUQ2oXC7H2tpaa0Byd3fH29sbPz8/goKCCA0NpWXLloSHhxts2wlw+fJlioqKePXVV1m/fj1r167VkRFsPhZrNBoI4GRspt626PQCrqbk0dzL+AwllH/2vjkaaxYueNG2s3qEDKB2iIJScFv59ddftREtFXniiScICQlpkDE1FnJycghwdWRKWAHfzZ2OT9+HCel9v8UZlSojskv1MSUY391eQXqlYHy5VMKYLgEUlii5lpJX5WNogvFbt27Nvn37+Pbbb5k1axbp6ekAzJ8/H1tb2yqvkZeXp3XAR0ZGEhsbS0JCAsnJyWRkZJCdnU1CQgJRUVFGI5gkEonWAe/g4ICLiwseHh5cv35dW7BevXqVvn37MmnSJD766CM8PT1N7gVfGQ8HBdeSq35tquoFX1ZWRl5eHi4uLjV+7DuNaNtZNSK3tG6IJW/Bbefnn39mzJgxALi6upKVlcW8efMseoYyLS0Nb29vPDw8SEtLQ6VS0aFDB86cOSOWWG4iJAG6VOeC/2JiVxys5fwbnUFSdhGejtaM7uRPcy8H3tlxkfUHo4xe25gLPisri//9739cuXKF3bt31+vzAUhJSeHq1atcu3aNqKgo4uLitA74zMxMbQRTcXFxldrN8HYdKbr/XagiiswQozv588mjnXjlxzP88N+NKo+t7IJPTExk7dq1fP755wAkJyfX6LHvNFXJSewUMqb1C6NToAsdA1xwsVMw54cz/Hiy6tekqchJTEHIAOqO5f1KCW4rhoqhxMREoNxocPr0aXJycnB0NO9ZtuqwsbFBpVKRknKrx/Lly5d5//33eeGFF2jr59yAo2scCEmALtW54LefTeCRuwKZ2D0IFzsF+cVlnIvP5oM/L7HnkvFe3mDcBe/i4sKKFSvqOnSjeHl54eXlVa0DHiAoKIi4uPJuP5pAeoVCQUhICF3vGcqhGhaTzTzteXtUW/6LyeT/qimc4KYLPi2f1GunWLFiBb/88gtQbhbSdHxqzFRlWHKzUzBrYEtuZBZwKTGXns3cTbqmubTtFDKA+kEUlII6U53exFblgc+Imfyw6k2sra3x9PRsqKE2Gvbv1zc+lJSU8NprrxESEsL48eMbYFSNi7y8PKzLCvhqyt0069KHbI/2tB3yCHEZhRYpCdC44I0F4287m8i2s4k1vq4mGL+xv26apXeAe++9l+nTp/PAAw+gUCg4FZvJIRN6wWvwdLBmw+Ru5BaVMX3zf5g6IXVX9x4UxV/W215WVsZrr72m7YoUHBxMWFjYHesJv3LlSvbs2cMHH3xAy5b6CRLVte1MyS2m26I9pOYV097fmW0zqi/wwTzadgoZQP0hlrwFtcYUvYkGTWccoTeBqKgoWrZsadT5/vXXXyOTGZ+JsxSefPJJNm7ciLe3t3Y5UalUUliqslhJgCW74KdPn46bmxtTp04lNDRUZ19NXPCO1nK2PtMDPxdbHv7iCNer0ZZWJPeH18iIOFujcctkMq0m1M7ODkdHR5ydnbXOeG9vb3x9fQkICCA4OJjQ0FA8PDyQSk1P9Rs+fDh//PEHcrmcl156iTfeeEOnvWdNmgZoCkpTlryhabftrO7zpJBJeWlwSx7s7I+zrRWXk3JYuusqB6sozpvK5+l2YBnfwoJ6p6LeBKj2i0rTZvFwZDqDlu23aL2Jn58fs2bNYsWKFRQXF+vsmzlzpigmb6LpYV1Rm9ahQwfmzp3LpEmTGmpYDYolu+BXrVpldJ+pLnhruZR1k+8i1MOeieuP1aiYlACxF/7j8D9/89xzzxEREaE1CQ0dOpSPPvqImJgY4uLiiI+PJykpidTUVK0bPicnh7y8PLKzs4mIiECpVBp1xUN5NJOmP7ydnR0ODg44Ozvj6uqKh4cHPj4++Pr64u/vT2RkJFA+U7p06VI2bdrEsmXLGDduHBKJpNaGJVMwZliKj49n+fLlODs7M3/+/Nvy2HWlKhkAwNKHOzCsnS8bDkURnZbPQ10D+fKJboxfe5QTMfqpAWA+MoDaIApKQY0RepO6YW1tzdKlSyktLeWzzz4DQKFQUFJSQlZWVsMOrpGgVqs5d06/aLpw4QKffPKJxRaUIFzwhjDFBS+VwIrxnekS5MrTX5/gZGxWjR5D44IfPHgwFy5c4LPPPuPNN9+ksLAQLy8v2rZtS9u2NZulKykpIS4ujsjISG7cuEF8fLy2L3x6errWmJSXl0dSUhKxsbGUlpZWWYiqVCqSk5N57LHHePLJJxn98DhiAh6u0bhqSmx6AfnFZdhbyzlz5gxLly5ly5YtKJVKWrRo0SAF5c8//4yfnx/duxsu7KqTAXQMcGZkR38W/X6JtQfKC/afTsWz88V+zB/WmrGrDUsszEEGUFtEQSmoEUJvUn/ExMQA5a0pv/nmG86cOUOnTp0adlCNhAULFrB371697W5ubvz6668NMKLGxYwBLfBwsBYu+AoMCPeqcln3fyPaMLiND7svJuNiq2B0J3+d/b+cjjd6bZlUwoCWXtq/FQoFc+bMYcKECSxatIhhw4bVaswKhYJmzZrRrFmzGp2nUqlISEggOjqamJgYpk6darCLkJWVFZEpORBQq+GZjBqY9+5H7PvlG86fP49UKtW68u3t7W/vgxth4sSJFBQUMHbsWD788EO917i63NJh7XwpU6rY8m+sdltxmYrvj8fx6n2t8HW2ITHbcOcmc8otrQmioBSYjKZPrqkRE+O6BfJgJ3/CPB1wspWTklPM0ch0Pv3rGjeyytswmnufXA2G3O9qtZqAgAC+//57JBIJd999d0MPs9EQFWU44mbUqFEEBNzmX8cmQmUXPColCBe80f1tfMsNMoPbeDO4jbfe/qoKSmMueF9f39vqgjeGVColICCAgIAAevXqxeOPP67d5+bmxvTp03nmmWcICgriVGwmD9bAsFRb1qzfQEli+WRDxYin06dPI5VKtf/kcjlyuRwrKysUCgXW1tbY2NhgY2ODra0t9vb22n9OTk44Ojri6OiIq6srzs7OuLi44O7ujpubm/Z/5XLdUkatVmtb/f7666/8+uuvPPfcc7z55pu4u5c72KuTAbT1cyIqLZ+8Yl2t++kbWUD5+8lYQVlVbqk5IwpKgclo9CaeDtYmRUy09XMmLrOA3ZeSyS4sJdDNjvHdArm3lRfDPjtASm6xWetNqnO/27WayD33TOF6Sp7otlCJr776ioULFxIWFqazvbFn/d1JlEolpVlJbHqyG3Pe+YiNB68T1vt+0oulwgVvoFAYt/Zora7b2F3wKpUKT09PwsLCmDlzJmPGjMHa2lq7XyE33dxTF56b9gxbVy8lKSlJZ7uPjw+dO3emoKCA/Px8ioqKtP9KSkrIzs4mLS2NsrIylEolKpWqVv3iJRIJUqkUmUyGVCrVygI05sfPPvuMFStW0LlzZ0Y/PI7YrNZVXs/L0YaU3GK97Zpt3k42VZ5fUQZgKVjOMxXUiYp6E1MjJt749bzetl0Xktg+sy9juwSwan+EWepNTO22kC+140i6hMGf/CPc7wYIDQ3VOl0PHTrEiRMnDEaiWCq7du1i+PDhuLi4aLW3b84cwcChQy3WBf/eg+0ZtGx/vRpQ5FIJ7z3Yvt6uV9/I5XISExN1er9XpC5tO01FArw7bxZL//ciGzduZP78+aSnp6NSqejTpw8//PBDja+pUqnIy8sjPT1d+y8rK4usrCyttjQ3N1erMc3Ly6OgoIDCwkJycnK4du2awWueOXOGxCIZVg+8WeXj21hJKVHqF7bFpUrt/qpQA9Hp+RaVKWwZ3zKCOlNRb1KiVJGap3/nZgqapW6nCn2FzUlvUlP3u2a/cL/rywLkRZmoVCqWLVtGjx496NGjR0MPsVHh4eEBoGPkeuihhxgzZgwrV67Ezc2tgUbWcFiqC95YMQmmGZbqisawBPDUU08xbtw4Pv74Yz744AP8/f2rOdswUqkUJycnnJyc9GKiqiM2Npbg4GCgvOBWKpWMGDGCV155hb59+3I6LqtaGUBRqQqFTL9otLaSafdXR0k9xns1BURBKTCJusROuNhZIZNI8HOx5YV7y13dhyJuhRSbi95EuN9rTnWygPCXt5AS2IpryblCFlAJQ8uCpaWl/PTTTyxatMgiC0oQLnhDVGdYAni8ZzBONlbapdyBrb3wcS7/702Ho8ktNtx7vbJhCcqNOG+88QazZ8/Gysqqnp6F6WiWuRUKBU888QQvvfQS4eHh2v2myABScovwMbCs7eVYLidIzjGsn6zInZIbNBZEQSmolrziMmLrcHd7bN5A7V1dRn4Jb/12QS8Y1pDe5MSJE2zYsIFRo0YxdOjQWj/+nUC432uGqbKAIitHvjuZwLcn4oUsoAIRERGMGDHC4L5ffvmlxq5hc0O44HWpzrAE8EzfMAJcb322hrXzZVg7XwB+ORVvtKA0ZlgCdMLV7yShoaFs27aN7t27G+zMZooM4GJiDj3D3HGwlusYczoFumj3V4Xk5uNYEqKgFFRLTHp+nfQ3T2w8jrVcSjMvBx7s5I+dQt+JqtGbhLpYsXXrVpYvX87p06eB8iWLxlxQ1sT9LpHA2M4BDG3rQ1s/J1zsrIjLKGTb2QTWHojUdmwwZ/e7kAXUnYMHD+q0ItRgb2/P8OHDG2BEjQ/hgr9FdYYlgD6L/67xdRurYUkikXD//fcb3W+KDOCP80lM69eM8XcHaXMoFTIpD3cN5FRsplGHt4aKMgBLwbLmYwW1oq46kCOR6ey7msr6g1E89+1JZg1sweM9g/WOG/fYRFxdXXnqqae0xaRMJtPGPDQE8fHxBsXdFdG4393sFMwa2JJmng5cSsw1eKytlYylD3fE3UHB5mOxvL39ImduZDF7UEs2PnErNkjjfjc3Vvx9jXk/naO4TFVjCYVSpaa4TMW8n86x4u+q/z8xdyZPnszVq1f1oqby8/MNFpqWSqCbHV8/1Z2PB7qSc3IHrlZlVFYbSoBgdzsmdQ9mz+x+fP1Ud7MqJjW892B75FLjWsva0NgNS1UxINwLWRWvx+m4LLafTeDVoeHMu68V47sF8u3U7gS42vL+H/r93CtiSAZgCVhW+SyoFfWpA4nNKOBCQg6jO/nz1ZEYnX1XLl2gtKREZ5tSqWThwoW8//772NjYaLPJNFlkXl5e+Pj4EBAQQFBQEKGhoTRr1gwbm6ojHUxl5syZ/PLLLzz//PO88847uLi46Oyvqfu9VKlizKrDnIy91bZr6/E4bmQW8NLgcHo3c+dQRLpZut+FLKB+adGiBT4+PgDMmjWLjh07cuXKFVxdXRt4ZI2DqKgoHn30Udq1a8cPP/xAXl4eHzzclQmTp1ikC95SDUvGMEUG8PIPZ4jPKmTMzV7el5JyeWrTcf6NzqjyvKpkAOaM+X+KBHWmvmMnbKykeu45CbDkzVdZ+MZrZGbq9kht1aoVVlZWZGdnk5eXR2xsLNevX9cKr40hl8uxtrbG1tZW2wfXzc1N2wfXz8+PwMBAQkJCaNasGV5eXtqYGg2xsbGo1WpWrVrF5s2b+eijj5g8ebL2uJq630uVap1iUsPOC8m8NDic5l6OWsNSVe73kpIS1Gq1Tt5cY6amofgdA5x5qGsgnQJdaOXjiJVMSsj8HTrHmLMswBCGwvEVCgUtW7bkk08+aejhNTry8vI4fvw4x48f125bsGABMTExvPLKK7i4WF7hLQxLtzBFBlBcpuL9Py5XOyNZkcYqA7gTiIJSUC21iZ2QSSXYK2TkFOkWfR0DnAn3duTXMwk624Pc7Zj1/LM8NXkib7/9NsuWLdMG3H7yyScMGTLE4OMUFBQQGRlJZGQksbGxer1ws7KyyM3NJSMjg8TEREpLS6sMzZVKpVhZWWlnQ1NSUoDymdLMzEymTJnCwoULeeONNxg5ciR76+B+r4jnTedgZsGtGVpD7ve0tDRWrVrFJ598QseOHQ22J2yM1DQUf0C4F4/eFcjlpBxiMwpo5qkv7jfnUHwN1bngncIfo3ufx4UL3gCtWrXSaQEIkJiYyHvvvcfdd9/NqFGjGnB0DYcwLN3CEnNLbyeioBSYROXYieoiJiQSODJvINvPJnI1JZfCEiXhPo483DWA3OIylu+9pYGrqDdxcHBg8eLFTJkyheeff569e/dq88QMYWdnR7t27WjXrp3Jz0XTBzcyMpLo6Ghu3LhBQkICycnJpKamkpmZqZ0NNTQLqumdK1HYEvTS96Cnyqo50/qFkVNUyr4rKTrbNe73+JhIPv74YzZu3KgtinNzDes07yRqtZo5c+bQvn17Jk2ahEymb3qoTSj+N8diWLU/guIyFQtHtjVYUJqjLECDqS74bKWCQykiHN8Q7777rsGbx6lTpzJy5MgGGFHjobJhSSYBZRU1lbkaloQMoH4RBaXAJCrrTaqLmEjOLeK7E3H0DHNnWHsfbOQyUnKL+O1MAiv2XtcGnINhvUmrVq3Ys2cPSUlJ+Pr61utzqdgHt1+/fkaPUyqVWFlZaVt4SSQS5HI5ffr0YdiwYdj5t2TJuboXk8/1b0bfFp7875dzejO6aiCwdRcyo/S/8BISEpg3bx7Ozs44Ozvj6uqKq6sr7u7ueHh44O7ujoODg94yfn1SWFjIxx9/DMDSpUtZtmwZgwcP1jmmNqH4aXkl1R4D5hWKr0G44OvOyZMnefvttw3ue/PNN6sMArcUNIala8m5zPjkO85nqFG4+Vlc204hA6g/REEpMInKehNTIibe3n6x2mOq0ptIJJJ6LyZrQk5OjraYDAkJYcaMGTzxxBNa1/mp2Ew4V3W3heq4v70vcwaHs/V4LN8cizV4TEGx4eIqISGBDz/80KTHkUqlSKVS5HI5crkcKysrFAoFCoUCGxsbbGxssLOzw87ODnt7exwcHHB0dMTR0RFnZ2dcXFxwcXHB1dUVNzc3bdFacQbo0qVLDBkyhEGDBvHxxx/Tvn35sk9dQvGrw1govlqt5vTp03h5edW6U0dDIMLx64d27dqxZMkSNmzYwKVLl3T2nTlzhsDAwAYaWePh4sWL/PjjjzRv3py9S6dTVlZGVl4hN7KLLc6wJGQA9YP5v1ME9Yal6U1cXFxYunQpHTp0YODAgXozfXV1v/dp7sFHj3Rk75UUXv9Fv++5hsMH/2H391/yzjvvUFRUhFKpRCKRMHr0aN5//33S09PJyMggMzNT2+s2JydHu2yfm5tLQUEB+fn5FBYWUlhYSHFxMcXFxeTl5ZGZmUlZWRllZWVa3Wpt0Jy3Z88eOnTogJeXFwOGDCM24OFaXc9UKobi5+TksHnzZlauXMn58+eZPHkyGzduvK2PX18IF3z9oVAomDNnDoMHD6ZTp05YWVkxbdo0zpw5o3XGWzp//PEHb731ls62B4YNYdSoUcycOROFQtFAI2sY9GQARqQmGsxVBlAXREEpMBlL05tIJBJefvllo/vr4n7vFOjCFxO7cu5GNs9/e9LoF5cECPdzo8vcuUyZMoW3336bVatWoVQqcXNz02knVp+oVCoKCgpITU0lPT1da3DKyMjQFqw5OTnExcWxbds2/XFLJCgUCjJKpPWWDmAMNfDznoP8/dPXfPvttxQXly+pS6VS7Owa53urMhoXPGCyEx6gmacDb97fmruC3ShVqth7JYV3d1wiI7/E4lzwoO+ET0orT1RYt24djz/+eAOPrnHRt29fvW0HDhzg4MGDjBo1iubNmzfAqBqWQDc73uznxn++hZzMtefbv88gd/Ep70hxE0uQAdQWUVAKaoTQm9yiNu53KC8CNkzuxo3MQqZsOq7tjmOIit0WPD09Wb58OTNnzuS9996rshNEXZFKpTg4OODg4EBoaKjR406cOMG2bduQSCSo1Wq8vb156aWXeOaZZ3BxceFUbCYPrqqbLMAUnnp6GiWJuu9JtVrNtm3bSExMxNfXl8DAQMLCwmjWrBmtWrW6Y23hVCoV3377LcOHDzfaX1vjgge0AfnVOeF9nGz4/pke5BaXsWTXFewUMp7pG0Yrb0dGrTxkES54qNoJD2qCZ3zJdefOwglfiYSEBIPbFy5caJHFpIYpU6Zw8OBB7d92zq7c99AkOnftxoOjHrAYGUBtEK+KoMZo9CZv/HwWpRpUNXA5m5vepKbud5VazVdT7sbZ1oo1/0RwbytvnevFZuRzMjYLMN5toWXLlo1mGVeTg9m2bVvmzp3LI488orNUVp+h+FXh7+tNVKL+TU5CQgK//PKL0fOsrKywtrbWySn18vLC19eXoKAgQkJCaN68Oa1atcLRsXbFyL///sukSZNwcXHh448/1skxBV0XPJjuhH9+QHPsFHIeWHGQhJtt4M7EZbF5ag8e6hLAluNxZuuCB9Oc8CABB082/xvHV0djhRP+JnFxcUycOFFvu0QiYdasWQ0wosZDv379dArKguxMflr/Gf/uDOB/0/VfM8EtREEpqBV9fKUkb5xJ+MSFpMrcLVZvUlP3O4C/iy0A84a11rvej//FaQvKptBtoX379sTGxhIQEGDQOVvfofiGkADnDu/l38MHmDZtGtevX9eaqbZs2cIjjzxCSkoKV69eJSIigujoaOLi4khMTNSJibpx4wYRERFVBubL5XJsbGxwcHDAyclJ263J19eXgIAAQkNDadGiBeHh4Tg5OQGQnJwMQFZWFlOmTGHNmjV88cUXdOjQAdB1wQMmO+Hva+vDX5eTtcUkwKGIdCJS8xjRwY8tx+PM0gUPwglfV/Lz8/H29iYyMlJnu1qt5tChQwwbNqyBRtbw3H///bz33nt629euXdsAo2laiIJSUGPOnDlDjx49KCoq4ofn+lFq616+5HQ1hdh0/fBlc9ab1Mb9XrnjiyGaUreFqhyztZUF1ASNLGDAgAGcP3+eZcuWsWDBAoqKivD09ATAy8sLLy8v+vQxPNtXmbS0NK5cucL169e1WaWaAjQjI4OcnBzi4+OJjIystgCtnM157NgxOnXqRM+ePXnvvffYc6m0xkY3bydrPB2tORefrbfvzI0sBoSXz2wbc8FrSEhIwMfH57ZGS9U3wglfd1q1akVERATHjx/X9oMfMGAAUVFRWFlZNfDoGpb/+7//09vWrVs37rvvvgYYTdNCFJQCk1Gr1axYsYKXXnpJ+yPq7++PlZUVC0a2ZQFtDbaHM3e9iaW532tKTWUBucVl+LvY8mDn8rifDv7OAMwYUK7ris8q5Oebs72VZQEKhYK5c+cyfvx4tmzZQu/evWs1Zg8PDzw8PEw+Pz093WABmpKSQkREhNYoBGhnTw8fPsyAIcMInP19jXMRvRzLX6+UXP2ZzJScYlztFChkUkqUKh0XPEB2djabN29m9erVnDt3jr/++ot77723Ro/fUAgnfN2p+B2tdPJFYmXDI2NGsXXr1oYeWoOzb98+PvroI73tOTk5DTCapod5/9IL6o3U1FSeeOIJfv/9d53tlWdf7K3ltPVzvpNDa3Aszf1eU2oqC8gtLiPQ1ZY5Q3Qd7Jq/j0amawtKY7KAoKAg5s6dW99PxSju7u706tWLXr166e2bPXs2y5cvR6lUIpPJUKlU9O/fn2HDhhHUoRdz92XV+PFsrMpnFEsMGLo0Ji8bq/KCUg1EpeaRHXOBNWvW8N1331FScivbtKnMTlZ0whuinZ8TrwwNp0uQKxKJhJOxmXzwx2UuJhovBizFCV+VcSnwpR+IcbJiwW8XmNA9yKKNSzdu3EChUOh8PiQSifZm0ZLNSqYgCkpBtfz77790795dbxZFE5YtEO73qqiNLOBoVEa10oCmIgvIzs5GqVTi6enJtGnTeOqppwgJCQFuhuPvq7kLvqi0vGg0ZHqyvrlNcwzAXd17UJxwxeC11q9fz6lTp2jWrBmtW7cmNDQUufzO/jSo1WpKSkq0Ji9DVHTCV6atnxM/PtuLhOxCPv3rGlKJhEk9gtn6TA9Gf36IyLR8g+eZuxPeFOOSRCIhMbeMr4/FsPFItEUblyZOnMhjjz3GtWvXaNWqFWFhYQwdOpTk5ORam/IsCVFQCqolMTERuLVUp8FQ32ZLRuN+f/2nM5Sp1Eikpr8+5uZ+r4wlywLmzp3L2LFjGTJkiJ4+rbYu+JTcciOOl6N+AeblZE1mQQklylsFZZ9ePdj383WUSqXe8d988w3ffPONzjapVIq1tTV2dnY4OztrzUcBAQEEBwcTFhZGeHg4rVq1wsbGplbPoSI///wz48aNY/78+cyfP1/vmpWd8JV5eXA4RaVKxqw6TFZBafk1T8fz98v9eWVoONM3nzR4njn3gxfGpZqjkQPEZCmx8grls5VfMGLooIYeVpNBFJSCajHW/lCtVqNWq0Vf3AoUXdhL7Kp5hDw8n1KP5hbrfq+MJcsCwsPDjQbQ19YFn5xTTNrNWKHKdAxw4WLCrWVeCfDrN+sozv+Y+fPns2bNGmQyGUqlEqlUSlRUFFeuXOHatWtERUXpGJCysrJITU0lLi6O0tJSg2PRhNjb2tri5OSEm5sbnp6e+Pn5ERQURGhoKC1btqRt27a4uLgYvMbFixcpKyvjnXfeYdOmTaxZs4YhQ4Zo91d2wlemW4gr+6+maotJgNTcYo5FpXNvKy/sFDIKSvSLaTDPfvDCuGQ6xuQAflOWM2NfMYvP/s2AcC+LlwOYgigoBdVizMWqVCopKirC1tb2Do+o8VFcXMyrr77KZ599BsD9DtE89+IUi3W/G0LIAvSpiwv+z/NJjO0SgK+zDYk3o4N6NXMvD84/GKU9TuOCt7d244svvuCJJ55g6tSpXLx4EXd3d4KCgggKCmLw4MHVPmZGRgaXLl3i6tWrREVFERMTozUfZWZmkpOTQ3JyMmfOnNFb0dBgZWWFjY0Njo6OuLi44OnpSUJCAhKJBJVKRWxsLEOHDuXhhx/mk08+wc/Pr9p+8Aq51GCDgMISJdZyGeHejpyKyzJ4bnVO+KaGMC6ZhilyADUQk1Eg5AAmIgpKQbUYmpno27cvS5cutfhisri4mNOnTzNt2jTOnj2r3R4WFkYLb0eLdr8bYsaAFrjbWzP/x5MglYHE9CVfc5UFVHbBg2lO+M/3XWd4e1+2PN2DLw9FY6+Q8Uy/MC4l5vDDf+VtGg2F4/fs2ZMzZ86wcuVKg0vgVeHm5kbv3r1Ncr8XFhZy+fJlbf5nTEwM8fHxJCcnk5GRQXZ2NlFRUVy+fFmnf7ymEP3hhx/44YcfaNW+E4Uj3oEqGihEpubTKdAFqQQ0L6OVTEKnQBcA7etojMpOeKVSyR9//MHy5cs5d+4cERERTeK7rjrjUoi7HS8PDueuEFdcbBUkZBXy65l41hyI1NHcVsQcjUtCDnB7sLxfNEGNqThDKZVKef/995kzZ44w5ADPPvssGzdu1LYehPIlwMqvjSW63w1RWFjIR8+NIf76De555Quu50ktXhZQ2QUPpjnhE7OLeHTNEd4Y0Ya594VTqlSz93IKi36/qNVPGnPBy+VyXnjhhdv3pABbW1s6d+5M586dqz22d+/eHD6sa06SSqX4+PgQ3rU3p6vpxvXN0RgWPdiexWM7sPqfSKQSmDmghTZeycaqaj2zGohOz8dDVsT69etZuXIl8fHx2s+1sdnWxkZVxiVfZxt+fb4PuUWlfHUkhqyCEroEufLS4HDa+zvz9Nf/GTzP3IxLQg5w+xAFpQCgyhk0TRsqe3t7/v77b7p169aQQ21U7Ny5E9A3LAldqT7nz59n7NixXL1a/mW+9rEOlNl5WLwsoLILHjDJCQ9wLSWPx7/81+C+puKCB0hKStL+d+fOnZk+fTrjxo3D0dHRpH7wm/+NxdfFlmf6hvFQ1/Kg/TM3svjinwhm3tuCghLj4fMa7hkwkPSrukWVWq1GJpOxd+9eQkNDadasWb2YkGpDZGQk169fZ/DgwQa/X6ozLj3Y2R9nWyseWn2Yayl5AGw5HodUKmFslwCcbOTkFOm/TuZkXBJygNuLKCgtmKqyySRAkJsdA8K92HviIk5OTkRERODh4dFQw22UPPbYYyxbtkxvye7PP//kueeea8CRNR52797N559/zh9//KEjn7CysiJUyAIAy3bBAzz00EPk5eXxzDPP0LFjR519pjrhl+66wpp/Imjp7UhuURlXknN55WZ2qbHYoIoUFxo+RqlU8sADD+hsk8vlKBQK7OzstH3gXV1d8fT0xNvbW2tICg4OplmzZnh7e9d5Ree9995j/fr1DBgwgM8//5zWrXVbt1ZnXHK8+VlKq9TWMyWnCKVKTamy6lWCpm5cqkoOsPShDtobEUN0f38PyTn6TQTMUQ5QFyzj21qgQ03FyMp2j9Or72QKpeJDUxmFQoFUKtUpKAW3KCkp4cknnyQ+Pl5vX+WsQ0uWBViyCx7gww8/NLqvJk74nKIyTsRkav/u3dyDhKxCIlLzqjxPAiRePcuOX39i1qxZpKamaj/TAQEBzJs3jxs3bpCUlERKSgrp6elkZWWRk5NDZmYmiYmJlJaWVvk9IJVKtYYkOzs7nJyccHFx0UYy+fj4EBAQoHXGN2vWTEe3qekJf+DAAdq3b8/s2bN58803tfmI1RmXjkZlML0/LB7bgWV7rpFZUELXIFcm9Ahm4+EoCkuN62mrMi6dOXOGgoICevbsWdVL3OBUJQf49t9YDl5P19kmkcCi0e24kVlosJgE85MD1BVRUFoYtRUjX81GiJENoFartRpTqVSKjY0NjzzyCB988EEDj6xxkJiYqM0xrUxVPbAtEeGCN0xtnfD3t/elU6AL7+64SHUSyCB3OxxsrHj00UcZMWIEb7/9NsuWLaOsrIywsDCef/55kx5TpVKRlJREZGQk0dHRxMXFkZCQQHJyMqmpqWRmZpKdnU1eXh5xcXFERERU+znQzIZqurdojl+6dCmff/4548eP58mnnyW2mtdn/9VUlu66wvP9mzO4jY92+/K91/hod/XvuYrGJbVazd69e3n//ff566+/CAoKIiYmptpr3C4OHDhA69atja6gVScHOBmbxcnYLJ1tdwW7YqeQ88tp/ZthDeYkB6gPREFpQQgxcv2TlnbrS6pjx478+OOPhIWFNeCIGhfBwcEMGjSIXbt26e376KOPWLZsWQOMqvGi44KXSMud8CZiri54MOyEr8jdIW68MLAFB66lkllQSudAFx7uGsC+Kyl8eTi6ymtXdsI7ODiwePFipkyZwiuvvGKwnaYxpFIpfn5++Pn50adPH5PPKygoICoqiqioKGJjY3V6wWtmQ69fv653XmFhIRs2bODr7X/jN2V5tY9zI7OQf6PT+eN8EpkFpdwb7sXz/ZuTmlfMV0eqLgjVQERKDpcO7+a9997j7Nmz2uYWDakZz83N5Z577sHOzo7XXnuNF198ETs73Zn56uQAhhjVyR+VSs1vpxOqPM4c5AD1hUTdVOxrgjqx9XhsvS6nfTimvdn9aBmjKm1fWFgYUVFRTJ48mTVr1qBQKBp4tI2P+++/nx079NsoXrhwgTZt2jTAiBovsbGxDBgwgNj0fDpMfZ90Ky+TXfDmnJF3LTmXwZ/8Y3R/kJsd745qR1s/Jxys5cRlFvJ/J2+w7mBkldpADXtm92v0M0yurq5kZWVpJTaOjo48+uijjBw5kjxrD+b/nVHl+Q908GXx2I4M+GgfSTlF2u1LxnZgRAdfen24VycY3hBJX71ssIWnXC4nLCwMhUKBtbU1NjY22NjYYGtri62tLXZ2dtjb22s1pw4ODjg6OuLg4ICTkxNOTk44Ozvj7OyMi4sLTk5OJmtOk5KStM03JBIJHh4eLFq0iCeffFIrq7lnyd81muGWSyX8+9ogIlLzePiLI9UeH+xux/45A0y+vrkiZigtAI0YuUOAM2O7BNAzzJ0AV1syC0o5FZvJR7uvElVJtN7M04E372/NXcFulCpV7L2Swrs7LpGRX77sYu5iZFMMSz1DnEgtkfPggw+ycePGBhpp46egQPeL/KmnnuLee+8VxWQF1Go169at48UXX9S+Xh8/EIZfqy4W74IHw074isRmFBh1u1dFU3HCq9Vq7fuiY8eOzJw5k0cffVQ7E3chIRv+PljlNSb2COZCQrZOMQmw51IyD98VSFtfJw5FpBs5uxxXZ0eSDEzYqVQq4uPjUSqVqFQq7f/Wx3yVVCrV/pPJZMhkMuRyOVZWVlhZWenMjqrValJTU3nmmWd48cUXGTVqFAOHDic2w7VGj9mvpSdu9go+3m18ubsilXNMLRXLfvYWgkaM/Gy/ZtwV7MqO84lcTszF09GayT2D2T6jDw+uOsTV5HLhuo+TDd8/04Pc4jKW7LqCnULGM33DaOXtyKiVhyhVqs1WjFwTw9KNzALcJy1DEexMXEaB2RbXplDVLO65c+Uz405OTvz4448mdWSxJNauXcvKlSs5ffq0znYXFxcRjl8BS3bCSyQSvv/+e/z9/bnrrrv09ptiXPJwsCanUH8GUi6T6vyv0TEA108dIfLqJV555RV27typbeHZo0cPDh06ZPTc0tJSsrOztf9ycnJ0/uXl5ZGfn6/9V1BQQEFBAYWFhRQWFlJUVERRURHFxcWUlJRQXFxMaWmp9r8NUVBQwJYtW9h28BTuE5ZW+dwqM6qjHyVlKrafM6z/rowmx9RSTYUaLOfbyEKpKEZedzCKWd+d0lkC2n42gZ2z+jH9nubM/v40AM8PaI6dQs4DKw6ScLOl25m4LDZP7cFDXQLYcjzOLMXINTYs3dx9PC7HIg1Lpszi9g5zJU/mgJNTCdeuXcPLy8vY5SySpKQkpk2bZnAmx8nJSedvS3bBg3DCjxo1yug+U4xLUWn59G3hQaiHvc6K1MiOfihVai4l5hg9F2618Gzfvj1//vkn+/bt4+WXX+bkyZM4ODhUea6VlRUeHh63JXbu1KlTdOnSBUCnwJ0/fz73338/p29kM6aaHNOK2ClkDG7jzT/XUquVAFSkxEDrT0tDFJRmTkUx8snYTL390ekFXE3Jo7nXrS+E+9r68NflZG0xCXAoIp2I1DxGdPBjy/E4wLzEyMKwZDo1mcWNy8jH+8kV3BVgT7G86h8dS8TNzQ2pVGqwBWLlglJQyQmvVpdnu9QSc3LCQ/XGpTX/RNK/pSffP9OTr45Gk1lQysBWXgwI92LLv7Gk5Bqe6QPDLTz79+/PiRMn2LZtm1bD2BBo3O8AI0aMYO7cuTpGKmsTc0w1DGnjg51Czq9VuLsNYWpeqjkjXgEzp7psMgAPBwWZN7WR3k7WeDpacy4+W++4MzeyaOt360dOk01miOLiYoOuxMZIfXdP+O54bL1cqzGy9Xgsg5bt53BkudaquveW6mbLvFMJBQxatp+tZvza1AYrKyuj2YXG4pYsGbVaTfyuDaT/sRyZRI1MWrOCUiaVYC2X8uGY9jw/oPltGmXDMKF7UJWfx3+jMxi7+jDnE7KZ1D2YN0e0IcjNjsU7L/O/X89XeW1jLTwlEgkjR45s0O5pnTt3ZsmSJVy6dIlff/1Vz5WvkQOYyuhOfuQVl7H7UrLJ50huPo6lI2YozZi84rJqs8lGd/LH19mWj2/mkGl63xq6W03JKcbVToFCJtX2Cq4sRo6NjeWLL75g9erVZGVlkZ6ejouLSz0+q/pFY1iyU8iY1i+MToEudAxwwcVOwZwfzvDjyRt65zzeM5jHe4QQ6GZLZn4p288l8NGuq9pgYHM1LIlZ3PonPz/f4HK3po+14BYHDx5k9uzZnDhxAolEwq6d37Fg++UqZ8o1mHs/eKjeuARw5kY2T248XqPrNnbjkkKhYM6cOUb31yTH1M1eQe/mHvx2JoGiUtOXsDVyAEtHzFCaMTHp+VWKtJt52vP2qLb8F5PJ/90snGysyt8ShvQgxTe3aY6B8qXNqNQ8du/ezciRIwkJCeHDDz8kIyMDlUrV6GN0NIYlNzsFswa2pJmnA5cSc40eP+++Vrw9sh1XknN5e9tF/riQyOSeIXwxsav2GI1hyZwQs7i3h5ycW7o1iUSCTCbj9ddf5+rVq6LN6U3OnTvHiBEj6Nu3LydOnACgQ4cONPN25uunurP7xX5M6h5MsLud3kyUhPJIl0ndg9kzux9fP9XdLItJDe892B55DWdtq6OpGJeqYkC4l0mz2fd38MVKJq3RcrchOYClIkpqM6YqkbCngzUbJncjt6iM6Zv/Q3NDq7krM6QH0WhRKt+5devRk6L4y9q/NXowiUTC008/jbe3t05bsZCQEPz8/Orc27Y6PvvsM9asWcPixYsZPny43v6KhqWU3GK6LdpDal4x7f2d2TZDP5TY09Gap/qE8n8nb/DyD2e026PS8nl7ZDsGtvLir8spZmdYqs0s7oj2vkztE0ozTweUajVXk3JZ/U8kf18pl0iY6yyuIapyZ6empmqPa9OmDZs3b9brZW3JPPnkk2zatEkboA3l3yt9+/bV/i2c8LewdOOSMSZ0D2LjkehqjxvdyZ/U3GIOVtFVpzLG5ACWiOV80iwQYyJhR2s5G5/shpOtFQ9/cURneTslt9yI4+VorXeel5M1mQUl2uVuDcEB/lypUFBqUKvVfPvtt0bHJ5FIkMvlWFtbY2tri729PU5OTri6uuLm5qbtb+vn50dgYKC2x23lLgjG+Pfff7lw4QIjRoxg+PDhfPbZZzRr1ky7v6JhqUSpIjXPuCgdoEuQK1YyKdvO6gaxbTuTwNsj2/FARz/+ulxeMJmTYUkzi+vpYM2sgS25kVnApcRcejZzN3j85J4hLBzZlr8uJ/Pjn5extpLyUJcAvnyiG9O++Y+dF5LMNnZKgykO+AHhXmSe+B2A0aNH89133zX6Gf07yfHjx7X5rpXbE4aHhxs8x9Kd8CBaeBrCFDkAUCM3ODR+OcCdRhSUZoyhbDJruZR1k+8i1MOeieuPcT0lT+ec5Jxi0m7O0lWmY4ALFxN0oyUkwH/7/yQxLppZs2bx+++/azs5NG/enEuXLhEfH09MTIxOS7HU1FTS0tLIyMjQ5pBlZmaSmJhIaWmpUaOCBplMhkKhwMbGBjs7OxwdHXF2dsbNzQ0PDw+8vb3577//tMfv3LmTVq1a8corr/D6669jb29vkmGpIpoZ2uJKM7Qa7WT7Cj9kGsPSAm4VlCqVit9//50PP/wQKO8/29ip6SwuwORewZyOy+KpTSe0274/cYOj8wfyUBd/dl5IMrtZXA01ccCXO3I70OnFdXz2xnhRTFbi7NmzQPmNZ0WdqVqtplWrVg01rCbBjAEt8HCw1sag1eR7zlxbeFpyjumdQhSUZkxlMbJUAivGd6ZLkCtPf32Ck7FZBs/783wSY7sE4OtsQ+LN6KBezdxp5unAhoNROsdqxMjNmzdnx44d/P777zz//PNER0fj4eGBXC4nODiY4ODgGo8/IyOD6OhoYmNjiYuLIzExkaSkJNLS0khPT9cG5BYUFJCZmUlJSQlKpdKgyUGzDP/+++/zwQcf0LVHb1LvmQs18P9FpJYX312DXTkSeaujxN0hbgB4O9voHK8xLMlR8u233/LBBx9w9Wr5rIGnp2eNXovbgVqtZsKECbRt25bZs2cbnPmt6SwulM+AV+68lFdcRkFxmY5cwpxmcaEWOaY39+fY+lhkjml1XL58GSsrK0pL9bMARUFZPeO6BdG7mUe1NzgaZJLybN1g6yI2zbivyS9zV0bIAW4/oqA0cypmk/1vRBsGt/Fh98VkXGwVjO7kr3PsLzeFyJ/vu87w9r5seboHXx6Kxl4h45l+YVxKzOGH/27p5QyJkYcPH87ly5dZuXIlgYGBdRq7m5sbbm5u2tBaUykpKSE2Npa+ffuSlJSks08qleLt7Y1/eEdSaxQmARcScjgVm8mz9zQjOaeIIxHpNPdy4N3R7SgpU2FTSWKgBvqNGMuFgzv1ujmUlZXx7bff6vSv1cyw2tnZ6bQTu10UFRWxZcsWoFxvumjRIp544glt/1swLXaqMkcjMxjWzofJPUP461Iy1lZSJvcMwdHGii8P37ohMTSL21SpkwNeDcoylXDAV+LixYsGi0l/f3/8/f0NnCGoTKCbHV8/1f2WBKOaFp6fvzSOvyPOc7rzbwQ+8EBDDfu2IeQAtxeJuj6abQoaLdeScxn8yT8AbH26Bz3CDOveAELm79D+dwsvB94Y0Ya7QlwpVarZezmFRb9fJC2vROecPbP7NdolS1dXV7KysgBo3rw5L7zwAo8//jjOzs6cis3kQSN6Gc1yriHDibeTNSvGd6HbzVnJMqWKdQej6BHmRpiHAx3e3qVzfOKmlyhJrN2Xl0Qi0elhK5fLdXrYKhQKrK2tsba2xsbGRrv8b2tri52dHfb29jg4OGj/OTk54eTkhLOzM05OTkgkEvr00V22btmyJUuXLuX+++8nv0RJ+wU7DSYFVPUaudsr+HRcZ/o0v+VSTs8rNjgrLgHOLxiqY5xIT09ny5YttGvXjv79+9fqtbuTbD0eW6+zHh+OaS9+qICAgADi48tvcjUympEjR7Js2TLCwsIaeHRNl6qMSwMGDGDfvn0AvPrqq7z77rtYWVk14GhvDxVXE4QcoP4QM5RmTkUx8ri1R00+71pKHo9/+a/R/U1BjNy1a1ccHR2ZOXMmAwYM0Jn1q21Xg+ScYh7+4ggh7nZ4OloTnVZAal4xx+YPJLLSMi/A33/t5vsvPmbFihWo1WqtNjQ0NJS3335b28s2NzdX289W08e2Yi/b4uJibR9bTf/a/Px8ysrKKCsrQ6VSaZf763KPePXqVUaOHIlCoaBN7yGouz9b42sUliqJTM0jKbuQvy6n4GAtZ0rvUFZP6MrDa44Qk34rD07TA7eNrxMHDx5k9erV/PDDD5SWlvLQQw81+oKypg746PdHGL3WgWupTNrwr0U44KtzYxcXF2uLSYCePXuyZMkSevbs2RDDNSuqMi61atVKW1AuWbKE/fv38/333xMUZF7FU03lAKhVIJGadY5pfSAKSgvgvQfbM/DjfShRUxPNYFU0BTHynj17jO4zZFiqCdHpBUTfLIyaezng7WTDj//pFg8SoGOYH70++YRZs2bx2muvsXXrVgB8fHyYOHFiLR+9elQqFTk5OWRlZZGZmUl2drb2n6aAjYuLY9WqVXrnWllZ0alTJ1p37sq+Wjz2yse6UKZSM/WrW6acXReT2TenP68MCWfGllM6x89++RXO7dtGUlKSthevTCbD3d34bHpjoaYO+Be/O623rUOAM1N6h3LgWrn5yVwd8KY63yd0D2L/tu+A8vaT3333HUOHDr0jMhBLR5OFqrk5/e+//2jbti0rV65k0qRJDT28esVUOYC8KIv08//wZN/mfPTUKw013CaBKCjNnOTkZN554w3STibgNHh6vV23qYuRa9I9oSokEpg/rBUFJWVsPhajs69i94TQ0FC2bNnCnDlzeO2117jrrrvq9LjVIZVKcXFxwcXFhZCQEIPHnD9/nlWrVmmXE9u2bcv8+fN55JFHsLKy4kJCNvuWH6zR4wa62tI/3It5P53V2Z5dWMqJ6Ay6BrvqnbNv7x5KU8q1rhrzlFKp5Msvv+TXX3/Vaku9vLzw9fUlICCAkJAQmjdvTnh4+G3rxDRv3jzi4uJYvHixQc1ebRzwvxgITO4R5oZKpea3M+VxVObmgK+p833jkWhUCRl0v3c4h3b9ppNBKbi9aGQ2ms9hWVkZeXl5vPjii2ZXUGqoLsd03pzZrNizho/3QKibLTNmzGjoITdaREFpZqhUKk6dOsX27dv59ddfOXWqfDZIJpMx/+33+fxA3TuUmIsYuaJhCcpbKjrZWOHtVO7WHtjaC5+bzu1Nh6PJLS7jrfvbYC2XcjExB7lMyqiOfnQMcOHlH8+QcNMRD8a7J3Tt2pWdO3fegWdXPU5OTkilUvr378+8efMYNGiQzixQbWZxPW/ml8oMzCbJZVK9Lh4SYMYTj7J6+acUFRXpLNc7OjqiVCqJi4vj+vXr2h85Q2jyTCtmmXp6emoL0ODgYJo1a0bLli3x8vIyKVT/xx9/JCIigp9//pl3332XmTNn6ujJauOAr4xCJmVYO1+ORWWQlKP7/jEHB3xtne9yvzZkBrXjh5Pxwvl+B5FIJAY/Z87OlpHtaUgOkJ9/S8o0c+ZMcnNzmT9//p0eWpNAFJRmxPHjxxkxYgSpqanaZQsNb731Fq8Mb0+gp7MQI9+kcveEZ/qGEeB6a9Z1WDtfhrXzBeCXU/HkFpdxISGHKb1DGNXJH5VazZkb2UxYf0wnRgiaRveEoKAgCgsLjeYf1mYWNzq9AKVKzf0d/Nj8762bFx8nG7qFuHEiOkN3DO52fDznfV5/dQ7z589n3bp12hmS5cuXM378eJ3j09LSuHLlChEREURHR+vkmmoyTZOSkoiOjtYLw66IJsfUzs5OW4B6eHjg4+ODv78/wcHB2oSAwsJC5syZw9q1a1mzZo22S0ttHPCVGRDuibOtld7MpTk44OvifFchobhM9H6/0yQkJFSbAWxpREdH6/z92muvsWnTJo4ePXrbVkeaKqKgNCOcnJzIz8/Xu8uUyWRMmzYNqEU22c395ihGrtw9oc/iv6s958eTNwy2GqxIUzAsaaguTLums7gZ+SV8fyKO8XcH8e3U7vx5IQkHhZyJPYKxkUtZuS9Ce+2Ks7ju7u6sWbOGp556iqeffppz584ZXGb28PDAw8OD3r17m/T8cnJyuHr1KhEREURFRWnzTFNSUrRZpunp6cTHx1NaWmrU0KRWq7l8+TL9+vXD09OThx+bRKztvSaNoSpGdfKnuFTJH+cT9fZpckw1sgm1Ws3BgwdZs2YNnTt35qWXXqrz498u6rv3u6eDtdncyDZmnnvuOfbu3Utubq5OYWnJYTCRkZF6265cucKqVavETGUlRGyQmbF//34GDBig/QKQyWQMGzaMbdu26R1rajbZxB5BTaI4qg1xGQUMWraf4ir6ntcUa7mUPbPvMYviu2LsFMDBVwfozOJWpM+He7mRVYhMKmFC9yAevSuQYHd7AM7eyGL53ut6M7mGYqeUSiXHjh2jZ8+ed9yIUVRUxPXr1zlx4gRPPvmkwWOcnJwI7tSbnF7PG9xfVaRSRRys5Zx4fRD7rqTy7Ob/DB6zY2Yf/GxVfP3116xYsYJr164BMGzYMH7//fcaPrs7g+YzJZNKTO79LpHAhLuDeOzuIMI8HSgsVXIpMYd3tl/kUlKuWX2mGjupqalMmDCB3bt3a7cFBgYSG1t3uVRT4+zZs3Ts2NHgvitXrtCyZcs7PKLGjZihNCNUKhULFizQuZtUKpVGfxirEyNXjPEwV0T3hKqpzSyuUqXmqyMxfHUkxugxVc3iymQyevXqVadx1xYbGxvatWun1VhqDEuBgYE899xzPPHEE/j4+FSZY2oqw9r5YGMlM2jU0TB0+AgSzh7W+UxLpdIGc8CfO3cOV1dXAgICjB5TU+c7wJKxHRjVyZ+fTsaz6UgMdgoZbf2ccHewBnLN1vneGPH09OTPP/9kyZIlzJ8/H7VaTXp6evUnmiGOjoYnUhwcHEQxaQDzrxgshLKyMrp168bp06cZOnQokyZNYuLEiTg7O3P//fdXe35V2WTmjuieUDWW2ANXEwQ/cOBAnn32WQYNGqRj5KltjmlFRnXyJ6ewlL2XU4wek5KYoLfcqFKp+Oabb9i8eTNWVlbY2Nhox6txw/v4+GjNSKGhobRs2bJe2n3ed999ZGRk8NZbb/HSSy/pSSZq43wf0d6Xh7oGMu3rE+y8mGzwGHNzvjd2pFIpc+fOpW/fvvTt21ebhWttXW66s5QJiNDQULZt28YLL7xATEyMVgYgOjUZxvzeARZIUVER7dq1IyIigscee4zNmzcDt/Rx1enkBDBjQAs8HKyFYckAljiLGxQURHZ2ttH9dc0x9XS0pmeYOz/+d4MSpWG5hQQ4sus3Zj3/LIcOHbq1XSKhY8eOeHh4kJ6eTlZWFjk5OcTGxnLt2rUq3fAVzUgODg64urri7u6Ol5cXfn5+BAYGEhISQrNmzWjevDk2Nrf606vValJSUigrK+O1115j3bp1fPHFFwwcOFB7TG2c71P7hHI6LpOdF5ORSMBGLqOwVP85mIvzvSnRq1cv9u/fT79+/fh04/cU+HYxKUe0hbf5FP33338/3bt359577+X8+fMAVc7QWzKioGxiqNVq5s6dy/Dhw+nfvz9ZWVm0bt2apKQkZsyYwfLly7XHPvzwww040qaHMCwZR8zi6lLXHNORHfyQSSVVLncHudvRtWM7Dhw4wNatW5k1axbp6emoVCqef/55pk6davTctLQ0rl+/TkREBLGxsVo3fEpKijboPisri6SkJEpKSoyaLiQSCXK5HBsbG2xtbbXOebVaTWRkJIMGDeKuu+5i0aJF9OzZs8bOdwdrOR0DXPj6WAyvDAlncq8QHKzlxGYU8OGfl9lx7pZZyRyc702R4DZduOetH1gZbYMsNsakHNG+zT3M6jvR09OTAwcO0KNHD65cuUJKivFVBUtGmHKaGMeOHaNHjx7Y2Njw3XffMXnyZLKysnjrrbdYsGBBQw/PbKjKsARqgt3tzd6wZAjRA/cWC367YNQBP6lHMH+cT+RCQg5wK8dUw2/P98bL0YaeH/6FoW9gmVTCpO7BOrNxOTk5vPXWWyxfvpz9+/eb7HQ3hbKyMu0MZ3R0NLGxscTHx5OcnExaWhqZmZlkZmaSkZFh9BpyGwf8X9xqcJ8xo1JbXyd2vNCXjPwSlCoVn/51jZyiMqb0DqGDvwtPbjrO/qup2uMN9X4X3D7q+nlfOLKtWeWI5uXl4e3tTXBwMBcvXrSYpX9TEQVlE2P69OmsW7dO2xoLYPny5SK9/zaSV1TKf1djOXDoCG8veBNHinhkzCjy8/NZvny5xYT+ajCl84kGzX5zm7GA2jngAcI87Nn7cn/WHohk0e+XjF7fkAMeoLS0VCdg/U5x9OhRbS9tjVnJ0dGRAQMGMGLECMocfVh81nBXG2MFZbcQV36YVm7AGr3yEKfjsgCwU8g48MoAItPyefiLIzrX2jGzj8Xqve8kdckRrcicIS3NKkf0vc+/5NMd/xE+YCxxFrT0bwqWW0o3Empyh1NUVMTmzZt1ApsdHBwYNmzYnRquRfLx4vd56623tH9nAKtXr0YikfDhhx9aXEFpag9cc4+dqo0DHiAyLZ+Q+TuM7q8ux7QhiklAZ3ayV69ePPfcc4wZM0Zr1DgVmwlna+Z8Lyot14/GZhRoi0mAghIlf11OYXQnf72blpJ6jPgSGEbkiOqjvZG+4YVDp2HEGpC7mPvSf3WIgrIB0P4Q11DcvG3bNnJzc3WulZ+fz4ABA7hy5Qq2trZ35glYGP369TO4vUePHvj6+t7h0TQeKsdORaXm0fXu7tzTpzc/f70GWyupSS0OmzKW5IDv3bs3ixcv5v7776d169Z6+2vjfE++2W4yzYB5Jz2vGIVcip2VTEcuUB8Oe4Fx4jIKeOu3C0D5TLEpWaJLH+rAQ10D9a4VkZLHwGX7efO3C/Rq5tFkCyu9FqLVfNw13weHI9MZtGy/2S39G0MUlHcQU5YKq7rDee+997THaZacAJo1a0ZpaakoKG8T/fv3Z9SoUfz6668624VapJxDhw6xcuVKLl++TEniVXb/cBX3375FrVZz6tQp2rRp09BDvG1YkgPe2dmZV155xej+2jjfU3KLSckp0nZeqoiXkw1FpUrySm4Vk5KbjyO4fWhyRAHc7BQmZ4kWlyqZW+lzkFtUCtCkc0TrsvSvvKk9tZQWoqKgvEPo3eFUM6NR+Q7n4TA1p0+fBsDe3p6RI0fywAMPMHToUNzc3G7r2AXlLf8qc/ToUbZv325Szqc5c+zYMb799ludbcXFxdjY2FhEvIZwwJdTW+f79nOJTOkdSp/mHhy8mWHpamfF4DbeHI5I1zEtBbnbWbTp4XZTMUcUTM8ShfKi0VhqQVPNERVL/zVDfDLvAPVxh/PNVQgYOpVPnxnGyJEjkcvF/3V3itLSUn788UeD+77++muLLyinT5/ORx99REJCgs724cOH4+Tk1ECjurOIHNNyatr7Pbe4jJX7rjOivS+rJnRh/cEocovKeKx7EFZSKUt2XtZeu2Lvd8HtoWKOKGBylqgGqQTsFHLyKkgUNDS1HNHaLP1XRC6V8McLfWnh7cii3y+x9kBkk1/6rw4hRrnN1OcdjqzzaEoD7xLF5B1GKpXSrVs3hgwZou028uijj3Lo0CE2bNjQwKNreGxtbbn33nv1tkdERFiULGBctyD2zL6HXmHly4IyadV9yDX7e4W5s2f2PU2+mASY0D1Ip5h+pm8Yc4aEM6lHMADD2vkyZ0g4c4aE42xbbi5KyyvhodWHOXQ9nSl9QpkzJJyk7CIeXXuES0m3NONKlZqJPZr+a9SYqWmOaEVsrWScXzCU8wuGcvqNwbw9si12iluuf02OaGUyMzNZvHgx99xzD6mpqXr7GwpDS//NPB24lJhbzZnlTO4Vgp+LrgxNs/RvrojK5DYSl1HAj//dYOHItvQMcyfA1ZbMglJOxWby0e6rRKXla4+Nfn+E0escuJbKpA3/Apj9HU5jRCaTsXv3bqB8mbtXvwHcN34qtgGtic4uI0ReZtHLcEqlkr179+ptP3PmDN999x3jxo1rgFE1DJbugK+t8z0us5BnN/9ndH91zndB3ckrLjPoXDaFlNxivvgngvMJOUglcE9LTx7vGUJrXyfGrT2qLVJj0wvILy7/vrx27RqffPIJGzZsoKio3JwVGxtbLy1Cq6OsrIz169czatQofHx89PbXZekfwN1ewax7W7D6nwheHhyu3d5Ul/5NxXJ/Be8Ar/18jqf6hNI1yJUd5xO5nJiLp6M1k3sGs31GHx5cdYiryXkAvPjdab3zOwQ4M6V3KAeu3XpjN2Vxc1NGUyD8dbmAwJd+YMHRYjhaHpFi6dlj58+f11vulkgkuLq6kp+fb+Qs86ayAz46PZ9Zs1/mn317Ob73dzq2bdXQQ7xtWJLz3ZyISc+vdSvRxTuv6Py97WwikWn5vDq0FcPb+bDtbHnHIzXw/LwFHNy2lYiICB1zKZR/b9wJ/v33X5599llmz57N66+/zksvvaRjaq3r0v/c+1oRmZbHz6fidQpKaHpL/zVBFJS3Cc0dTn6JkhfiT1FaIWdg+9kEds7qx/R7mjP7+9MABsXMPcLcUKnU/Hbm1o+1ud/hNDYMOfMrf+lZevZY+/bt+eeff1AoFEyZMoWLFy+Sk5ODg4NDQw+tUZCZmsT1//7j5O6fKM3M5N5+vWnevDmtWrVi06ZNDT28eseSnO/mRH3ne64/GMXLg8Pp3dxDW1ACbPnuB0oSIwB0ikmArl27AuWFpVQqRSaTYWVlhUKhwNraWtsCVNOL3tHREScnJ1xcXHBxccHNzQ03Nzc8PDzw9PTE29sbb29v7Ox03zs5OeUdrAoLC3njjTf4/PPPWbx4MY899hhSqbROS/8dA5wZ2yWAh784bDDywJxbiIqC8jahucM5GZupty86vYCrKXk09zL+g6uQSRnWzpdjURkk3cxq02DOdziNibo68y0le0wqldK3b18AXnp1PtNffZNzCbk4OSgtvhUZwL333su1a9e0f2dkZPDvv/+atRZaON+bHvWd71lcpiKzoAQXW4XO9t07/2DrqqWsXbsWlUqlU1Q+8cQTFBYWkpOTQ25uLvn5+RQUFFBYWEhRURGZmZmkpKRQWlqKUqnUK0irQlOkyuVynUkBtVpNYmIikyZNYvr06Tw64XFiXIdRvvZUcxaObMv2swmcjM0iwMVwlF/FpX9zwryeTSOiujscDwcF124udxtiQLgnzrZWBmcuzfkOp7EgssdMRzeo3xW/KcsZ/+VJQMgBAJ577jlmz56tt33MmDENMJo7h3C+Ny1qkyNaFfYKGW52CjLyby0VS4CuLYPot3Il8+fPZ/78+WzevBmJRIJarWbdunXIZIbbdxpDpVKRmZlJcnIyKSkppKWlkZaWRkZGBpmZmWRlZZGdnU1OTg55eXnk5+eTmJio1W1WJC8vj2+37cbr8eG1es4Pdw0g3NuJ6ZtPVnmcGohOzze7FqKioLwNVCduHt3JH19nWz7ebbxgGdXJn+JSJX+cTzS431zvcBoDInvMNOoa1G8pzJgxg3nz5lFcrKvB2rdvHy+//HIDjerOMK5bEL2bedS493uvMHeLe580NLXNEbWWS5FLJeSXKHW2z7y3BVKphP1Xbzm3K+aIBgYG8s033/Diiy8ya9Ysbty4UeNiEspXSNzd3XF3dze5icLy5cuZNWsWarVaO2s5efJkXnzxRYodfHlwVc1aiAI4WMt5dWg4aw5EkJitX6xWxhxbiIpq5DZQlbi5mac9b49qy38xmfyfkQwrB2s597by4u8rqeQU6ed5gfne4TQ0muyxDjd1MNW58wEkEphwdxCP3R1EmKcDhaVKLiXm8M72i1xKyjVLZ76QA5jOmTNn9IpJgO3bt3PgwAGtXMBcMcX5rlarIS+ViUO6MalHsNCHNxCVc0Sh+ixRZ1srdrzQl9/OJBCRWr7q1q+FJ/e28mLflRR2XUoGjOeI3nXXXRw6dOh2PzUdSkpKUKvVeHp6MmvWLKZNm6ZtXnEhIbtW13y6bxhWMinbziZql7o1r5OzrRUBLrYk5xZp/RTm2EJUFJS3AWN3Hp4O1myY3I3cojKmb/4PY7/Bw9r5YGMlM9p1oLrHEdQeTfbYs/2acVdw9e58gCVjOzCqkz8/nYxn05EY7BQy2vo54e5gDeSanTNfyAFqxsmT+stfPXv2pHfv3oSHhxs4wzwx5HwvKVMhl0KnZv6oSgrB/U0OZzXjRlAQ/fv3b+ghWxwTugex8Ui0zrZn+oYR4HrrZnhYO1+GtfMF4JdT8eQUlfLX5WT6NPdgbBd/ZBIJ0ekFLP7zMmsORGo7HTWmHNHHH3+cli1bMnToUBQKXY1nbZf+/V1scLFTsGf2PXr7ZgxozowBzRn+2QEuJuaYbQtRUVDeBgzdeThay9n4ZDecbK14+IsjpOQajyAY1cmfnMJS9l7WD4Gt7nEEtadi9ti6g1HM+q56d/6I9r481DWQaV+fYOfFZIPXNSdnvpAD1JypU6dy33334ebmhru7O8XFxezfvx8rK6uGHlqDYW8tp62fM4mJieXmjJJCAN5++20A+vfvLwrKBqByjihgUpboS9+fqXJ/Y8sR9fT05IEHHjC4r7ZL/18ejmZXpd8Ad3sF74/pwA8n4th9KZm4m9c01xai5veMGgGV73Cs5VLWTb6LUA97Jq4/xvUU42YcT0dreoa58+N/NyhRGp+BNNc7nIakYvaYqe78qX1COR2Xyc6LyUgkYCOXUViq1DvXHJz5NZUDLH2oAw91DdS7TkRKHgOX7QcsI6hfIpEQGFj+OjzzzDNs3LyFq6kFlJSpUMilFu2EHzhwIJcuXdLbrnm9BHeeWzmiKmrrdK5MU8sRrc3S/4WEHC4k5OhcR7P0fTUlT1tsmnMLUcv8FrvNVLzDkUpgxfjOdAly5emvT3AyNqvKc0d28EMmlVS73G2udzgNiSnZYxXd+Q7WcjoGuPD1sRheGRLO5F4hOFjLic0o4MM/L7Pj3C1DVVXO/GvXrnHt2jWGD6+ds/BOURs5QHGpkrmV8ghzi0q1/21ucgBjaPSDRz2H4fb0EEYsP6jdZ8lO+Ndff52JEyfqbd+2bRsJCQn4+fk1wKgsG2d5Ga6Re0gK0m+nWluaWo5obZb+cw30LzdEY1r6r29ERXKb0NzhvD68NYPb+LD7YjIutgpGd/LXOa5y4Tiqkx9J2UUcjUo3em1zvsNpKExpO1bZnR/sZodUKuGBDn4oVSo++OMSOUVlTOkdwvJxnckrLtNxOFZ25h8+fJjFixfz22+/AVBcXNxgy6BlZWUkJyfj7+9vcH9t5ABQXjBWdXNkTnIAQxh0wotgfC0TJkzg+eefJztb1wiRlZXF559/zqJFixpoZJZFbm4u27ZtY+vWrWzfvh21Wk2XSTak+/eq87WbYo5obZf+K3Mjq5CQ+Tu0fze2pf/6RojwbhMTugehVKlp4+sEwOA23nzyaCe9fxUJ87CnQ4AL284maIXMhjDnO5yGorq2Y4bc+XbW5REXbvYKnv76P745FstvZxJ4bN0xMgtKmDGguc411EBkai4///wzd999N71792bHjh2o1eXddxoy6HrLli0EBATwyCOPEBERobdfIwcAOBmbqVNMQtVh/VJJ+WyuMTRyAHNj6/FYBi3bz+HI8pvDmjrhtx43v9ekMtnZ2XrFpK2tLd9++y3z589voFFZDvv27WP06NG4u7szYcIEtm3bpv0+2rv8VT4Y0x5ruVT72TcVmVSCtVzKh2Pa83yl78GmwnsPtkdew+ddHU1t6b+miBnK24TmDmfC+mMmB/pGpuXr3M0YwtzvcBqKqhzzxtz5RaXl58RmFHA6Lkt7fEGJkr8upzC6k79e7l637j0pTrjV97asrHyZRK1W06JFC532Yra2ttjb22v/OTo6av85Ozvj7Oys13LM2dkZqbTm94lJSUlIJBJ++uknfv75Z5577jnefPNN3N3dgZrLATTYWsk4v2Aodgo5WQUl/HYmgQ/+vExBhcw6cwzqF05403BycuLjjz/G09OThQsXcv36dZo1a8b48eMbemgWwYIFC9i/f7/e9mHDhuHs7My4bs4WmyMqWojWHFFQ3kZuiZvrq/eA+d/hNBTGHPNVufOTb7bETMvTd+yn5xWjkEuxs5LpaGtCggK4mni1PHevEikpKZSVlaFUKrVtxQwdZwqaNmOafrhyuRwrKyudvrjW1tbY2tpiY2NDYmK53lOpLC/0li9fzurVqxkyZAgzX3qlxnIAgJTcYr74J4LzCTlIJXBPS08e7xlCa18nxq09qvO5MBTUn5CQwIYNG9ixYwebN28mLCysVq/FnUY44U1HIpFouwgNHjwYX19fnJycdGKFLN24dDv55ptv6NOnD7GxsTrfNY8++qj2v03JEZVQrusf0NKLiT2CzGbCY1y3IKIS0/jiSCKo9eUqNaEpLv3XFPEJvY2IO5ymg6Hsserc+Sm5xaTkFGldfxXxcrKhqFRJXsmtYlIC/LfvT7LTU3jzzTfZsGEDMpmMsrIyfHx8SEhIMDg2lUpFfn4+GRkZeu3ENC3FcnNzycvL07YWKygo0OmBW1xcTFFREaWlpRQUFJCdna1TvGoKSQ1qtZqSkhK2b9/Ozn8v4DdludHXzlhY/+KdV3SO23Y2kci0fF4d2orh7XzYdvaWaUkT1N/K24E///yT1atX8/vvv2t79d64caNJFJRxGQX8+N8NFo5sa1Iovga5VMIfL/Slhbcji36/xNoDkdp9luCEB8jBjrunLyFZ4U27BTv1CxYLNS7dTgICAggJCSEmJka7TS6XM3LkSL1jjeWImmvBn5eXx8qVK3l93jzsOwzB9/4XUKqrl65UxNJaiJrXO6ARMq5bEGl5xfUyY2EJdzgNReXsMVPd+dvPJTKldyh9mntw8KZpxdXOisFtvDkcka6jhdU48+39/Fi3bh2zZ8/m1Vdf5ffff8fBQV97qEEqlWqXuoODg+vtOVdk1qxZrFy5krKyMmQyGUqlkjZt2jB+/HjCew3lld2GM1FNDevXsP5gFC8PDqd3cw+dghJg7MOPEnl8L6WlpdrevhqcnJzq/BzvBK/9fI6n+oTSNcg0F7yGyb1C8LsZMVIZc3fC6xiXnFuhNPAesmTjUn2ye/dufvvtN5YuXYq1tTXDhg1j//79dO/eneTkZKKjoxk8eDAuLi5VXkeTI2qOZGRksHz5cpYtW6bV97ZWZPB/L/W3yKX/miAKyjvAjAEt8HCw1raqq9EdjgTkMqnF3OE0JBWzx/43oo1J7vyV+64zor0vqyZ0Yf3BKHKLynisexBWUilLdl7WHm/Imd+2bVt27NjBgQMHtDNxDUVhYSFlZWVIJBJGjBjB3Llz6dWr3OF5ISEbDBSUNQnr11BcpiKzoAQXW4XevoS4WEpLyyOFKi/1d+7cGYlEgpWVFba2tjg6OuLq6oqHhwc+Pj4EBgYSEhJC8+bNCQ8PJyAgoFZa0qp48sknKS0tZenSpfj4+Ojt1zjh80uUvBBvmgseysOPZ93bgtX/RPDyYP3OOebshNdr4VnNV6Mlt/CsDxYuXMihQ4eIiIhAqVSya9cu+vbty/79+0lISGD8+PG8+OKLDT3MBkGlUjF//nw+++wzSkpKdL6Tn3zySYte+jcVibq2Ii1BjTEYIWIEmaT8y1V54zw7Fz1JmyARE3S7uZacy+BP/gFg69M96BHmbvTYiuapQFdbXh/ehl7N3bGSSjkZm8mHOy9z9oaue3XP7H6N9gvmjz/+YOfOnTz33HO0bNlSZ19+cZneEqS1XMpXU+6mvb8zE9cfqzZfVYO9Qsa5t4ay9Xgsr/1yXrtdApx7awjbf/k/ZsyYQUZGhraolEgkTJw4kaSkJFJTU8nMzCQnJ4fCwkK9L/6KyGQyFAoF9vb2ODk54ebmhpeXF35+fgQGBhIWFkaLFi0IDw+vdkYGwM3NjczMTBwcHPjggw949tlnkclk2v0LfrugF4ZckW0z+gDwwIqDOtsXj+1AS28HZmw5xcFX79Vb8obyG5JJ3YObdDB+ZepiXKrInCEtzdq4VF8kJibi7++vc7PWu3dv/vnnn3q/+WqKpKWlERQURGFhod6+f//9l27duultt4Sl/5pguc+8AajpHc7378/k0tG/6bPjQ3777Tf69OnTUEO3CCpmj41be9Tk8+IyC3l2839G9zcFZ/6wYcMYNmyYwX21kQNYy6XIpRLyS3S1mTPvbYFUKtHJ54Ty97yDjRXjxo1j2LBh/O9//+Pzzz9HrVbj7u7OV199ZXTsZWVlREREcOXKFSIjI4mJieHGjRskJyeTlpZGVlYWqampxMXFaWdADWFlZYWNjQ0ODg44Ozvj4eGBt7c3/v7+BAYGkpVV/jzz8vKYMWMGa9euZe3atdofmuqc8IZc8B1vdh16+IvDVTYPNjcnvDAu1Q81KWh++uknvW0ODg6UlpZibW19u4faqMnPz8fd3Z1jx44xYsQI4uLitPvkcjkdOnQweJ45L/3XBlFQNgCmipsLD3Xj0tG/yczMpF+/frz66qu8/fbbes3sBfWHcOYbpqZyAE8Ha3a80JffziQQkVpeRPVr4cm9rbzYdyWFXZdu9bytLAdwdnZm+fLlPPnkk0ybNg03N7cqxyaXywkPDyc8XH+52BA5OTlcuXKFq1evEhUVRWxsLAkJCaSkpJCRkUFOTg6xsbFcu3ZNz6xUkTNnznD33Xfj7+/P2HETiLXqZ/RYQy54gIUj27L9bAInY7O0bdqMUdkJX1RUxPfff8/q1at55JFHmsxSZU1beI7rFsiDnfwJ83TAyVZOSk4xRyPT+fSva9zIKp9NshTjEtzquvT3lRRiMwxMSBgxL23dulVPSrJz505mzZrF6tWr78zgGyEFBQX4+fnRr18/Nm3apLe/devWFl9wm4ooKBuYqu5wHBwckEql2viYxYsXs2PHDrZu3UrbtuYxU9HYEM58w1RsRVYxrH9wG2+9Y385HU9OUSl/XU6mT3MPxnbxRyaREJ1ewOI/L7PmQKSOWclYUH+XLl04fvx4vT8XJycnunXrZnAJqzIqlYqEhAR27tzJ1KlTDR5TWFjI/hMXUPc0XFAac8E/3DWAcG8npm8+adK4NU54m8I0Vq9ezdq1a7Wmgab0fVDTFp5t/ZyJyyxg96VksgtLCXSzY3y3QO5t5cWwzw6Qklts9sYlME0yZcy8ZFWSw8GDFdp93jS9denSpdG3fL3dnD59mpycHHbs2EFgYCAFBQW88MILeHt787///U+sDNYAUVA2YmxtbZFUyL1Sq9WcP3+e4cOHc/XqVXHXdJsQznx9aioHyCkq46Xvz1R7XGOXA0ilUgICArSRRZobvDZt2vDcc88xYcIEXFxcOBWbyYOrDuudb8wF72At59Wh4aw5EEFidpHJ47lnwEDSr/6n44KXyWSUlpaSk5PT4G74xMREoqOj6dmzp8H9tWnh+cav5/Wus+tCEttn9mVslwBW7Y8wa+MSGDAv1bDrkv3l37X7OnXqxIQJE3jooYcICQm5bWNuKpw4cUL7uS4oKEAikdC9e3cee+wxRo4cKfrJ1wBRUDZibG1t9QwHEomE2NhYDh48yMCBAxtoZOaPxpn/+k9nUKlBLTFdtG6u2WOWLAdwdXXF09OTkSNH8swzz9CtWzedmz1DwfhVueCf7huGlUzKtrOJ2qVuH+fyPFNnWysCXGxJzi3Sa3GZk5UB6LrglUolmzZt0i7XacxINjY22NnZ4eTkpO2m5OXlhY+PD35+fgQFBRESEkJYWFiVsVU14YMPPuCzzz5jxIgRfPrppzRr1kxnv6aFp1Kl5mRspt75VbXwrIhmqdvJ5tZPmKaFpzkZl6A+ui6pKG5+H+FjZOxYPFPv/xNL58SJEzp/q9VqJkyYQFJSEi+99FIDjappIgrKRoydnZ2e5kXzd0FB1Z1LBHWn6MJeYlfPp9tzH5Ggcrb47DFLlgN06tSJlBTDWZygH4xfXSi+v4sNLnYK9sy+R+9aMwY0Z8aA5gz/7AAXE3O02yXAv3/t4JXZL7Bnzx6dc0aMGIGfnx8pKSmkp6drnfCaQPzS0lJtm09jVCxENc54FxcX3N3d8fLy0hqUKhaidna6/98lJycjkUjYuXMnrVu3Zt68ecybN097XG1beAK42Fkhk0jwc7HlhXvLXd2HItK1+83NuAT1ZV4qv/EpajmYExlWWEo9aaph6dChQzoTN1KpFFtbWzw9Pe/kcM0CUVA2Yrp27Yq9vT35+frdNQxFGwjqh+LiYt555x0WLVoEwO+vDCe1WCayxxByAGNUdMKb4oL/8nA0uy4m62xzt1fw/pgO/HAijt2Xkomr1O4yyN2OTu1as2vXLn777TdmzJhBfHw8arWaKVOmMGbMmGrHWVBQQFRUFNHR0VozUmJiorYQzcrKIjc3l/z8fNLT0ykpKanSmAS3ClFbW1vy8/NRq9Xa4vWdd95h2bJlPPXUUzz+1DO1auGp4di8gVhblcc0ZeSX8NZvF7TNBDQYauGZnp7Ohg0bSE1NZfHixdW+Ro0FU7suSSQwtnMAQ9v60NbPCRc7K+IyCtl2NoG1ByIpLrtVLJm7eammhqXc3FwiI29FdLm6uvLqq68yffp0nJ2Fe7umiBzKRs67777Lm2++iUQi0bmL+vLLL3niiScabmBmyokTJ5g0aRKXL5eHkkulUr0fVJE9dkvTVapUVdsdpyLmKgeAWzmUrw9vzZTeoey+mMyOc4l6x2lC8SsT4GLLwbmm51AWFhayZMkSVqxYwT///EOrVq3q9wlVIC8vj+joaKKiooiLiyM+Pp6kpCStMz4rK4ucnBwSEhKM5oJaeYVW28Lz5+d6cy05j4e/OKz3vuoZ5o61XEozLwce7OTPjnOJrNofoXedHTP70NbPmePHj7NixQq2bNlCaWkpNjY2TepGfNL6YzzWPchg1yU7hVxrXLJTyLi48D5Oxmby16UU0vOL6RLkytguAfwblcH4dbc0zxrNsrmZl2qU8Xxzf9/mHjhd/Z2Vi9/GxsaGJUuWMGXKFL1Zd4HpiIKyCXDo0CEee+wx4uLitEveK1euZPr06Q08MvMhNzeXZs2akZaWplNEurq6kpGR0cCja5zEpufT/9UvUHmF1+hL3BzlAHArGL8mofgVqaqghMYdjK/B399f25Ne09novvvuY8SIEVj5tGDhEcMzlJ4O1vz4bE/kMikPrjxUbdelIDc7dr3Yj/f+uMRXR2J09rWO286Zvb+SmJioNVsAeHt7k5SUVA/Psu5cuHABf39/o4H6mvdSlyBXzsVn6WhpQ9zt2DmrH7+fT2L296exkklo7++ip0l94d7mvDQ4nAnrjupIA6BpvJdMpaJhqaZd6MpKi3GL/Iuj334sTK71gGVNqzRRevfuzfnz55k9ezbr168H4Nw5XR2bmDWrG+vWrSM1tTxsu+KMZEO7ZhsrhYWFPDZqKFGHDnHfo0/S/bGXLV4OoHHCT1h/rFbGpRtZhQaLzcbuhK9IXl659jEkJISZM2fyxBNPaHNELyRkw5GDeufUpoVnbEYBFxJyGN3JX6+g/Gv3TkpTymeGK86WJicnY2VlpQ2wt7e3x8HBARcXF20bTy8vL3x9fbXdlEJCQvDz86vXTjIqlYpu3bphbW3NkiVLePLJJ3U6LsEt85IpxqVSpWGD084Lybw0OJzmXo46BaU5mZfqZFhSg0SuILPlcNYejhXdluoBUXE0ERwdHVm3bh39+/dn0qRJ/P3337UOuBXo079/f4PbRUsyXRYtWsT58+c5ffq0VhYwvHdnZpoQ1G8JWLITHuCLL77Azc2NQYMG6X12KhuXoHrzUlXYWElRyHQfQwLs/PEb5r78ol6GqaurK61atSIrK4u8vDytYen69esolUo9A6TOdSUS5HK5Vitqb2+Po6Oj1j2v6ark6+urNS6Fhobi5uamkwYA5ashhYWFFBYW8vTTT7NixQpWrVqlE7VUm65LlfF0LJ9xyywo0dluLual+jQsWXK3pfrEcr7pzYSJEyeSmFvK0v03GPzJPzUOuDXHpcb6oKSkxOD26Oho8vLy6i1WpanzzTffaAtJDRXbGVp6KzJLdsIDjBs3zui+2rTwlEkl2Ctk5BTpOtQ7BjgT7u3Ir2cSdLYHudsxoG8vjh07xvbt25kxY4ZWKnTPPffw888/Gx1fSUkJN27cIDo6mhs3bujoRCs653Nzc8nKyiI5OZnS0tJqTUtSqRS5XI61tTV2dnZ6nc7Onj1Lr1696N69OwsXLqRNxy5VmpeqMi5VZFq/MHKKStl3RT+dwJB56cSJE2zYsIHRo0czZMiQKq/d0NS021LHAGce6hpIp0AXWvk4YiWT6q0GmLth6U4gCsomxtbjsaxL8ME+zAuVuuYBtwtHtmWcuAvTQ9NxRINUKkUqlTJq1ChRTN7k66+/1ismAZYuXco999xD165dG2BUjQ/hhDdOTVt42itkHJk3kO1nE7makkthiZJwH0ce7hpAbnEZy/de0x5fsYWnRCLhgQceYPDgwXz88ce88847BAcHVzk2hUJBWFiYNsS+JuTl5RETE0NsbCxxcXEkJiaSlJREamoqGRkZOjFO6em6ekbNzOixY8e47777sPFtjvfkTww+jrGuS5V5rn8z+rbw5H+/nNMrxuFW16VmbtZ8//33fPrpp5w8eVL7OjT2grKm3ZYGhHvx6F2BXE7KITajgGae+t/pltBt6XYjCsomRN0DbtXM++kcaXnFQi9SiZycHJ2/J02axLJly3B1dW2gETU+/vjjD4PbExMT2bdvnygoK6AJxq+VWcCMnfA1beFZWKrkuxNx9AxzZ1h7H2zkMlJyi/jtTAIr9l7XBpyD4RaeNjY2vPbaazz//PN6M4P1iYODA23btjWpBeZff/3FoEGDgFudl5ydnRkyZAhjx44lR+HOon/1daTGui5V5v72vswZHM7W47F8cyzW6Dgef2IKlw7+oeN8l8lkWs1rQ5GQkMDp06e57777DEqOatNt6ZtjMazaH0FxmYqFI9saLCjNvdvSnUAUlE2E+tGLlGOpepGq9H3/93//B5SHyf/www8W39/WEJs3byYuLk6nJzBAv379REcJA4zrFkTvZh5M+ux3oottLT4YH2rewrNUqebt7RerPa4641JjyhTMysrS/nf37t154YUXGDNmjLbgvZCQDf/qfsZMNS71ae7BR490ZO+VFF7/Rb9lZUXOnTlFaaUYJaVSyYIFC1i0aBHW1tbY2tri4OCAk5MTrq6uet2WAgICCA4OJjQ0FBsbm1q8Gvp8+umnLF68mG7durFq1Sq9G9XadFtKyzMsaaqMORmWGgJRUDYBNHqRFl4OvDioJe39nfF0sKawVMm1lFzW/BPJX5cNd/GQSyX88UJfWng76sSRWIpexBTj0j0tPTh6KQZXV1euX7/e4HfojRWJREJAQID2b7lcjkqlom/fvnrGA0E5DpJijrw/gWade/PIa8st3gkPwrjUt29f3nrrLcaMGUOHDh309te065KGToEufDGxK+duZPP8tyerfH0lwJuzp7Pk/XfJzc3VMSS1bt0aa2trcnJyyMvLIy0tjfj4eEpLS41mjGrQhNxbW1trXfTOzs64ubnh7u6uNS5VbP1Z2UWfmpqKVCrl5MmTdOvWjaeeeor33ntP27mmLt2WqsNcDEsNhSgomwAavYi/qy0O1jL+7+QNknOKsLWScV87H9ZP7sb8n86y5Xic3rmTe4Xgd7NXcEXMXS9iStCtxri0+Vgs6mGv08/bmnxssPRysqqZ3NOnTwPleYP79+/HyclJaEwrkZeXx4kTJwgODqZ3796UlJTgqM5ngXDCA8K45OXlxYIFC4zur2nXJYBmng5smNyNG5mFTNl0XKc7jiGC3O3435xXmPX8s7z99tt88sknqNVqlEolS5cuZdiwYQbPU6vVZGRkEBUVRWxsLPHx8SQkJJCcnExaWhrp6elkZ2druy1lZmYSERFRIxd9SUmJTuG6fv16Nm3axLBhw3j+xZfr1G3JFAwZlgSmIV6xRk5Fvci+K6nsu5Kqs3/TkWi2z+jD1D5hegWlu72CWfe2YPU/Ebw8OFxnnznrRSoG3YIJxqWbu8+lllisccmUmdz+4Z5kqmxwdnbm8uXLopA0wg8//MCUKVOQSCTaH9HAwEDtfkt3woMwLlWHxrz0+vDWJhmXvppyN862Vqz5J4J7W+nqUWMz8nUK0YrmJUdHR5YsWcLUqVOZMWMGe/bsISjI+GspkUhwd3fH3d2du+66q0bPqaysTOuir9xtKT09nYyMDHJycoiKitI5T61WU1paym+//cYfR89V223JFNNSVWgMS5b+Ga0NoqBs5FTUixhCpYaE7CI6Bui/+efe14rItDx+PhWvV1CCeepFhHGpZtRkJvebozHYjHmXuzxkZJZIEeWkYVJSyuUnFWdk/vzzT7755hsmTpzYUMNqdAjjknE05iVTjEuudgr8b65CzRvWWu+YH/+L0ykoDZmXwsPD2bVrF0lJSfj6+tbjM7mFXC4nJCSEkJCQKo9r1aoVV65c0cpobG1tmThxImPGjKHA1ovZfyQYPM9U05IplFQzwyswjCgoGzmG9CK2VjJsrKQ42lgxuLU3/Vt6sr1Sz+CON/O5Hv7isG6ScAXMTS8ijEs1o7YzuZcyVBY7k1sdZ86c4a233tLbnp+fz9SpUxk7diy2tvoSFEtFY1zS3NRIUKPGuB7XEoxLULOuS8Y6LBmiKvOSRCK5bcVkTcjPL8+PbNmyJbNmzWLixIk4OpaP90JCNqBfUNam21JVKOSioUVtEAVlIyavuMygXuR/I1ozoXt5pppSpebPC0m8+auuo2/hyLZsP5vAydgsAgxoKDUY0ov8+++/fPbZZ/z+++/8999/hIaG1tMzun3EZRTw9dEYPn+sS7WmpXHdAnmwkz9hng442cpJySnmaGQ6n/51TSeGxJyNS2Im9/ZQUlKCo6MjxcX6P2h//PGHKCYNEOhmxzsDvWn12jgGP7uQHMdAizcugeWalzZs2IBCoaBfv356Zr/67rZkCMnNxxHUHFFQNmJi0vMNTi5uOBTF7+cS8XayYUQHX2QSic4d1cNdAwj3dmL65pPVPoZGL9Lc3Ybvv/+eZcuWcerUKW0+WsWIi8bMaz+fw8fJxiTTUls/Z+IyC9h9KZnswlIC3ewY3y2Qe1t5MeyzA9q7W3M1LomZ3NtHt27diIyMNNgDvlu3bg0wosZPdnY2d999N8WpqTzV2YnRowdYvHEJLNe8NHjwYKP7atNtqaYEudtZ3HutvhCvWiPGmI4jIjWfiNTyZYGfTsXz1ZS7Wfd4N0avPISDtZxXh4az5kAEidlFJj3Og2MfJvL4Xp0WYhqX3cGDBykoKCAgIAB/f3/k8jv7likoKKBv374MHTqU1157zaARpKJxqXJ8kiHT0hu/6uez7bqQxPaZfRnbJYBV+yMA8zQu1SSCSiKBsZ0DGNrWh7Z+TrjYWRGXUci2swmsPRCpdZKa80xubXB0dNTekHl7ezN16lSSk5OxsxOvT0W+/PJLLl26xLZt20hN1TUbCuNSOcK8pE9Nuy0B+LvY8mDn8n0d/MvfVzMGNAcgPquQn0+VH1fRsCSoOaKgbMSYquP441wi74/pQJiHPaM6+WMlk7LtbKJ2qdvHuTxw1tnWigAXW5Jzi3Q6CyQnxhvtR/vCCy/obZPJZFhZWWmDb+3s7LR5Y87Ozri7u+Pp6Ymnpyc+Pj74+/sTEBBAYGBgjX9Ub9y4wcmTJzl58iTr1q3jo48+YsKECTq5ZVUZl6oyLek8zs2lbicb3Y+EuRmXahJBZWslY+nDHTkZm8nmY7Gk5xfTJciV2YNa0ruZB+PXlQdTm+tMrikYmkmztZKiVqtRKBScOnWqUejSGiMrVqzQtvvTcO7cOUaPHt0wA2qkCPOSLjXttgQQ6GrLnCG6xlTN30cj07UFpSHDksB0REHZiDGkFzGEjZUMAEcbOf4uNrjYKdgz+x6942YMaM6MAc0Z/tkBLiaWtxqUAPGXT7Nvz05mzpxJTEyMjjt13bp1pKSkkJqaSlpaGhkZGWRlZZGTk0Nubi4FBQXa4NuysjKjhWlFpFKpNnNMU5Da29vj5OSEi4uLNgTXy8tLpy1YWloajz/+OMuXL2fFihXcfffdgL5xyRTTEoCLnRUyiQQ/F1teuLdcB3goQrfPriHjUnR0NMuWLWPDhg18+eWXPPTQQ9U+58ZATSOoSpUqxqw6rNONYuvxOG5kFvDS4HB6N3PnUES6Wc7kVkV1EUuedhJcBj7NpzMeEsWkEW7cuMHVq/qzbm+++SbFxcW8++67DTCqxovGvPTqD6c4Ep2FTHLLJGcIczYv1bTbEsDRqIxqjUvVdVsSVI8oKBsxlfUi7vYK0vN1W0jJpRLGdAmgsETJtZQ8vjwcza6LyTrHuNsreH9MB344EcfuS8nEVTD6BLnb4WBjxf3338+QIUP47LPPeOuttygoKMDW1pannnqqxuMuLi4mPj6euLg4EhIStFljqamppKenk5mZqS1I8/Pzyc7OJiUlhdLS0ioDcDXbjx8/Tvfu3XF3d6fvgEHENp+kc5wppiWAY/MGYn2zGM/IL+Gt3y5w8GbBVRGNceny+TMsXryYH374AalUilKp1EbENAZycnJ48cUXmThxIvfee6/e/ppGUJUqDbc223khmZcGh9Pcy1FbgJvbTK4hTI1YSilQ43zXA7xxtIRdacfM7ge9Pli0aBF5eYbNE35+fnd4NE2DQDc7AiN+5f82bOWFz37geEKBxZqXLNWw1NgRBWUjp6Je5L0H2+NgLeff6AySsovwdLRmdCd/mns58M6OixSUKLmQkMOFhByda2iWvq+m5OkUm5X1IgqFgjlz5jBp0iRef/11cnNzazVma2trwsLCCAsLq9X5KpWKpKQk4uLi+OGHH/joo4+0+zRh0dbW1rRq1Qo772C9GdzqTEsanth4HGu5lGZeDjzYyR87hczgeNRAUNuuZESc1T6+ZiZ2//79yOVynJ2dcXFx0f5zd3fHxcXljmpOT548yZdffsmXX37JkCFDWLp0Ke3b3/qCrG0EVWU8Ha0ByCy4dXNjbhFUlalpxJIm+uZwZLqIWDLAO++8Q0pKCj/99JPOdj8/P5577rkGGlXj5tChQyxZsgSpVMrSx8rlJZZqXrJUw1Jjx/zfeU2cinqR7WcTeOSuQCZ2D8LFTkF+cRnn4rP54M9L7LlU85kyY3oRb29v1q1bV9eh1xqpVIqfnx9+fn6cPXsWKNdtqlQqRo4cyaxZs+jfvz8SiYRTsZkcWnVY5/yqTEsVORJZPru272oquy8ms+vFfuSXlPHVkRi9MeUVlBucKs+efv/993z//fdVPh+JRIJEIkEmk2n/WVlZaf9ZW1tjbW2NjY0NNjY2WhmARgrg6OiIg4MDjo6OODs74+TkhJOTE25ubri4uODq6oq7u7uOPGDv3r107NiRyZMn88477+Di6VPrCKrKTOsXRk5RKfuu6L7njLUsU6vVXLx4kdDQ0CZpTBERS/WPh4cHTz/9tE5B6eLigo+PTwOOqvFRWlrK3LlzsbW1ZenSpdrtarUaiURi0eYlYVhqfIiCspFTUS+y7Wwi285WPXtkCEPBt01FL6IpLCdNmsT06dMJDg7W2W+KcamiaSkyLd/gMbEZBVxIyGF0J3+DBeWmL9fz2cJXOXLkiE5LvXfffZd27dppdaWapXzNcn5eXh4FBQUUFhZSUFBAUVERxcXFFBUVUVJSQklJCfn5+ZSVlWk1qCqVSqeXbW0oKysDYOPGjWzcuJHQLn1RD5mrd5yps7kanuvfjL4tPPnfL+fIKSrT2Ve5ZVlaWhpff/01q1ev5urVq3z66acGTV6NGRGxdPuo2I5y8+bNjBs3rgFH0zhJSkpi2bJlOttUKhUJCQn4+/sbOctyEIalxoUoKJsAlqwXGTFiBPHx8Ub3m2JcqmhaqgobKykKmX4xJQEe6N+DR4cc4rfffuPll18mIqI8Wqh79+4MGjSouqdRa0pKSsjIyCAzM5PMzEyysrJ0iteKWtTz589z7NgxvWvIZDLsHZ0xJGAwdTYX4P72vswZHM7W47F8cyzW4HhT0zPZdf4Y69ev56efftLRxNrY2NT+hWgAahKxBOXdqR7qGkinQBda+ThiJZPq3chZasSSoaVZTVTQc889x2OPPdbAI2ycnDhxwuD28PBw9uzZQ48ePe7wiBoflbstoVaBxPhNsTkblhoaUVA2AYRexDgVjUummJZkUgn2Cpne7FrHAGfCvR359Yx+W6+KQbejRo1ixIgRrF+/no0bN9KmTZvb9+Qo17X6+PiYtBS4du1ajh07hkwmQ6lU0rZtW+bNm8ejjz7K1dQCRiw/WO01jM3m9mnuwUePdGTvlRRe/8X4kviQQfdSmhJlcN+GDRs4d+4cISEhtGjRgtatWxMaGnrHs01NpSYRS1Cud370rkAuJ+UQm1FAM0/9zFRLiliqzg3vICkiaPTLvPDGGw01xEaNSqUyaopUq9W4ubnd4RE1XgLd7Fj5SBt8W3Wh88MzkQa0t1jDUkPSOL/JBXoIvYhxNMYlU0xLTjZyjswbyPaziVxNyaWwREm4jyMPdw0gt7iM5Xuv6VzbUNCtXC5n2rRpTJs27U4+zWrRzAD279+fuXPnMmjQIG3rstpEUGnoFOjCFxO7cu5GNs9/e7LKmfJXpz/J559+bLDD0rFjxwzOoEqlUqytrbG3t9camjT5pRWLz2bNmtVb8blp0ybef/99lixZwgMPPKC3v6YRSwDfHIth1f4IistULBzZ1mBBaQkRS6a64XPVNshbD2Dopwfp29xDzBZVQiqVsnPnTkaOHElSUpLOvmnTptGyZcsGGlnjo6CggC5dupCfcJ0OpVf4fM4LFmtYakjEq9uEEHoRw2iMS6aYlgpLlXx3Io6eYe4Ma++DjVxGSm4Rv51JYMXe6zq9vKFpBd2OHz+egQMHGoxdqU0EFUAzTwc2TO7GjcxCpmw6ru2OY4hgdzvenfMGC994jTVr1vDqq69SWFiodcRHRERgY2PDpUuXuHr1KlFRUcTGxpKYmEhqaipZWVkkJSURHR2t1YBWRlN82tnZGSw+mzdvTuvWrWnRokWVxeeRI0e4cuUKI0eOZNSoUaxYsYKAgADt/ppGLAGk5ZUYPLYy5hyxVFM3vCZLUbjhDdOtWzeGDh3Kpk2bgPIVCxDRShpWr17NwoULkUqlJCSUry5pXhtLNiw1FKKgbGJU1otYcsCtBo1x6ffzSdWalkqVat7eftGk6zYV45IGuVxe5Q9NTSOo7BUyvppyN862Vqz5J4J7W+l2oojNyNf2zq04kyuTyZg+fToPPvggs2fPZuvWrQD4+vpia2uLn58fAwcOrPb5JCUlcfHiRa5du0ZkZKRO8ZmZmUlKSgoxMTFVFp8KhQJ7e3ttBydvb28CAgL4559/tMdt376dXbt2sWjRImbOnIlcLq+3iCVDmGvEknDD3x408W0ODg6cOnWKkJCQRisTudNoco4r8uOPP/LQQw8RHh5u5CzB7UKiNpYiLWj0XEvO5ZklX3O9wBq5s49F60XiMgoYtGx/lTNoNcVaLmXP7HvMpgi/lpzL4E/KC6kHOvjyyF2BtPJx1JnN3XQkWjubG+Biy8G5+gHpGn78L445P57V/r1ndj+D77M9e/Zw7tw5Zs+eXc/P6BYpKSlcvHiRq1evGiw+c3NzKSwsNFp8apDL5Yx+6FGOh4zX27dodDu9iKX5P53V0+MCLBzZlsk9Q4x255AA5xcM1VmCi46OZu3atWRnZ7NixYoaPPuGZ+vx2HrVeH84pr3ZraSYgqFl2rGj7mfXrl1cunRJFEkVyMrKokuXLkRF6Wu23dzcSE1N1WnRK7j9iNucJoxdWQ77P56BnZ0dyelZFq0XEcal6qlpBJWhuClDVDeTO2jQoNvqhAfw8vLCy8uL/v37V3tsWloabdq00bqMK6JQKIhMzYUQ/fNqGrFUFZqIpVbeDvz+++98/vnn7Nq1C7VajYODQ5MqKGvqhodyKcWb97fmrmA3SpUq9l5J4d0dl8i4KcOwJDd8deYlScvHuKfdSKQuYpm7Ilu2bDFYTAJ89NFHophsAMQMZRNk586dyGQyZs6cyeXLl7GysqK4uFhrwLBk6rLsVpFXhoTz/IDm9TCixoWYyS3H1taWoqLysPqAgACmTZvGE088QUBAAKdiM3mwUli+Ib6acjdONlYGI5aqm6EEcDyymoh//6KwsFAn2zQwMJDYWMOxTI2RSeuPcTgynb4tPHiyVwgnY7N03PDdQ9113PA+TjbsmNmH3OIyNh6Oxk4h45m+YSRkFTJq5SFKlWrtTYo5u+FNMS9p0EibhHnpFiUlJWzcuFHPHCmVSikpKUEmM9z5THD7sJwpLDNBrVYzcuRISkpuGQBKS0v5v//7P0aPHm3x2hphXKoaMZNb/hm666678PX15emnn2bgwIE6sxmmzjqaEphfFVcuXaD0Znejivf1cf/P3nmHN1W2YfyX0aZN996LAmXvKXvJcoCAKAgoCCIgshRFkKG4EEUQxIGAiggOFMEPFFmyN5QN3XvvnfH9ERKSJp0UWtLzuy4u7Tknp+9JM57zvs993zExujQlKysrbG1tcXBwwMnJCTc3N50Iyd/fnwYNGtCwYUPc3d3vy4zMtm3bWLx4Me+99x7Dhw83ummtjhp+ep+GyC2lPP75EeKzNEX9xZhMtrzYhZHtfNl6Osbs1fCCeOnesbS0ZPLkybz88su6IIjmzZuTnZ2NQqEQCspaoH5XHw8hIpEIOzs70tLSDLaPGjWKGTNmsGbNmloaWd2htHBJrVIiEpf94VIfhEv61HcLKpFIxH///Vfm/nuxWKr0GICrJw/xxrzZ/PrrrwYzlF5eXjRp0oT09HQyMzPJzc0lPT2dGzdu6BTzptCKkKytrbG1tcXR0RFnZ2ddEerr60tAQAANGjSgUaNGODk5VTjOkydPcuPGDUaMGEH//v1Zt24djRrdFcxURw0/qLkn/15P0hWTAEfD0ghLyWVoK29d4WmuanhBvFRzaGNtAX7//XeefPLJWh5R/UYoKB8yvvrqK6NiEjRvrNGjR9fCiOomfs5yvh3fDreGrbBtPYjgnk8IRrd6CDO5ZVNdi6Wq4O8ip2GgH7/88gsHDx7kpZde4tatW6jVagYOHMjGjRvLfGxqaiphYWGEh4cTFRVFXFycToCUnp5OVlYWubm5pKSkUFxcXG6Mp0QiQSaTYW1trcuKd3Fxwd3dHS8vLw4fPoxYLEalUnHgwAGaNWvG66+/zltvvYVcLq+yGt7DXoabnYzQuCyjsVyMzaRPyF3P1/LU8AqFgszMTFxdXSt8rusSQpRn9TElWCrKywZgzJgxQjFZBxAKyoeMhIQE3Qe8Pr6+vnTv3r2WRlW3OHHiBC4uLixbtoys6OuoMuI4tPNTwei2FKVncsVAeZ2V9Wkmt6oWSwA+jtYMb6vJV27lo5mRm3GnDzcus4Ad5zURoqXN8nv37s3ly5dZvXo1b7/9doWG1a6urri6utK5c+X6C1UqFUlJSboiNDo6mri4OBITE3VFaHZ2NhkZGSQkJFBSUmKyCNXOjr733nu8//779Ow7gKiOr6C5NbvLwqFNjdTwb/+hSVdyt9OY7yfnFBmdPzm7CCe5JZYSMcVKze+PTssnr0ihe58mJSXxzTffsHbtWrKzs8nMzHxo2nxi0vP55WwsS59oTtcGLvg6WZORX8L56AxW/nOTiFJtE+O7BjC+SyB+ztZk5JWwKzSelX/fpKDk7iy1uYuXKhIsedpJ8Rs2hxlvTautIQroIYhyHkIuX75My5Z3c7hFIhFOTk4mZy7rGyqVCisrK0pKSnTbxGIxCQkJuLu7l/PI+s2tpByGzHwfsV9Lii3s6/1MblUtlgC6BDnz05SuJs93IjyNZ74+ofu5LIulwsJCpFJprRdJKpWKmJgY+vXrp8ut18fBwYF2fZ8gPMR4VSTYzQZPeyudGr5EoWbhH6Gk5hbTMdCJn196hOk/nmN3KQ/P2f0b82q/RrRautfAimn3jO5kRl7m888/55dffkGlUqFSqR46MeK4DScZ09mf9v5O7L6cwPWEHNzsZEzoGoDcUsrwL45yM0kz2/3GoCZM7RXM7tAEjt1OpaGHLc91DuB4WBrjN57SndNcxUtVEizd2S8Ilmqfh+PWTsCA5s2b6/Kax44dy/r168nLq7oowBwRi8U4ODiQmpqq26ZSqfD09OSjjz5i3rx5tTi6uoVarWbMmDF4eHiQl5fH7e3fMGLECDZv+anez+RW1WIJ4EREeoU2SxVZLGnjM2sbsVhMQECATgkPmt7OadOmMXHiRLy9vctUw4el5BGWovk8+u18HN9N7MQ34zsybN1RCks0M4+mhE+yO9u0x2jp2KUrBbHXjI4XiUTMnTtXJ1Ly8/MjMDAQHx+fBy7IWLFiBXl5ebz22mvY2NgY7deKl/KKlcyMO0+JXhrFrkvx7H21Jy/3asjs7Rdws5MxqXsQv56LZe7PF3XHRaTmseyJFvRr4q6zYTJH8VKVBUt39guCpdqnfn1LmAkikQiZTIZarebbb7/F0tISW1vj3OD6yO+//25QTGpRq9WCKXApVCoVv/32m4FjwOnTp9m25TtGjRqFnV39ji17b3hL+n96qEr9pRUhFYt4b3jLig+sI7Rt25YWLVowY8YMBg8ebFCoVUcNn5yjKVDd7WRGx7nby8jIL9Ytd2uxs7GmwOhojW3Mp59+avJ3ikQipFIplpaWWFlZYWNjg729va5H1NXVFQ8PD7y8vPD19cXf35+goCCcnZ0rdU2lWbNmDTExMXz11VesWrWKUaNGGcycasVL56IzjB4bmZbPzeRcGrprPsPb+TthIRHz56V4g+P+vBjPsida8HhrbwNfT3MSLwmCpYcboaB8SNDv/5OI1CiQ8MmK93XZrgIaVq5caXJ79+7defzxxx/waOo2EokEPz8/gyXN6OhoJk2aRFhYGMuXL6/F0dU+gsUS/Pnnn2Xuq44aPjw1j9TcIlr6GN+stPZ15Gp8tsE2ERB+8SQXzpzk5ZdfJjT07t+iQ4cO/PLLL0RFRREdHU18fDwJCQkkJyeTlpZmIFDKzs4mOTmZkpKScpXyoJmdtbCw0ImVbG1tsbe3x8nJCWdnZ9zd3fHw8MDHxwdfX18CAwPJzMwENHGho0eP5vPPP2ft2rW61iRT4iV9XG0tuXVnuVs7U1tUaqZW2zvZslQ+dXnipYyMDCQSCfb29uVec11AECw9/AgFZR2mvIZkr5k/8lOuNSk7rzC2sz+NPMxjueNe2blzJ5999hlLly412K4/Cyeg4cKFC0RFRRltDwwMZObMmbUworpHfbdYKo/qquH3XE5kRDtfvBysSLhjHfRIsAvBbrZ8e8Qw+cTfRY6NTEq3bt04f/48GzZs4PXXXycrKwsPDw8CAgIICAio8tjz8vKIjIwkOjqa2NhYXSZ0SkoKaWlpZGZmkp2dTW5uLsnJycTExKBQKMpVzMNdP9H//vuPVq1a4efnx+ixE4imS5mPGdbGBy8Haz75R/MaC0vRPE/tA5w4Hn63L75ToGb21MPBuC2itHjp9OnTfP7552zdupWhQ4eyY8eOKjw7Dx5t2lIrXwdGtPOtlGhpaEsvXuweRLCbLUq1mpuJOaw/HM6BG5rZW3MXLNVFBFFOHURoSL43cnJydHfkTzzxBL1798bX15dRo0bV8sjqDqmpqYSEhJCenm6079y5c7Rt27YWRlV30e/rEiyW7rJk5xWdGv7L59qXq4bfcKdY9HKwYvcrPcguLGHj0UhsLCVM6dmAhKxCnlx7VLfkLRGLGNc5wGgpNz09nQ8++ICOHTs+8Pe0SqUiNTWVqKgonWVTeHg4q1evNnm8tbU1vi27UNx3rsn9wW427JjWjVtJuYz68hjal9aOlx+hkYcdS/+8wvGwNBq62/LusBa421khFkHDhf8zOteOlzpx+b89rFq1inPnziGVSlEoFAwbNqzOF5TatKU1z7SlQ0DFoqUJXQNZ+kRz/r2exP5rycgsxIxs50szbwde+uEse68kmq1gqS4jFJR1jHv94hIakjWzBNplnpSUFCwsLGp7SHWOlJQUhg0bxvHjxyn9EXDgwIFKZWLXN/Rv9FApoRJm+eZ+o1cdNTxAI3dbFg1tRodAJ0qUavZfT2b5X1dJzTWc4SxLDV+XCA8PJzg4WGdOb2dnx6RJk5g2bRqNGjUqU7zkZivjl6ldkUrEDF931MBKycNexufPtqPjnVlJhVLFN0ci6NLAmQautrRa9rfR+RI2z6E4wXAmXSQSERgYyGOPPYaHhwfe3t54e3vj7+9PQEAAcvn9f10mJSXRokULnn76ad555x2jPlX911A7fydC4zINREuBLnL2vtqTvy4nMnv7BQD2z+1FdoHCIPbUViblxJv9OB6WyuTvz+q2PwyvIXNBWPKuQwgNydWjtL+kKisJtVrNDz/8IBSTZeDm5sbRo0e5fv06TZs2BUAul5Ofn09sbGwtj65u4ucs5/tJnZky721+uZhE8/6jiM0sqtcWS9VRwwPcSs41sL8pTUVq+LqE1uKpefPmvPrqq4wZM8agUDMlXrKTSdn0QkfsrS0Y9eVxI1/OpOwiRn15nEAXOW52MiJT80nJLeLkm/3KjPm0lIop3dijVquJiIgoN0FNG/Op7RnVCpgcHR11cZ/u7u4Ganp/f3+cnZ0rFfcZERFBamoqX3zxBVu2bOH9999nypQpOoGXftpSZURL2uev9BJ4bpGC/CKFgUuAOQmWHgaEgrKOIDQkV42KDG9bvPkrJxX+hCTlCP2lepQuvksUmmdu9uzZfPTRR1y+fJkmTZrU8ijrHsePH+f27dsEBgbyzSfvAvDfP18KZvkIanh/f3/S09NxdHQ06YlZWrwkk4r5ZkIHglxteG7DSW6Xk7QUmZZPZJqmR7Whuy0e9lb8ctb4hk8ExN+4yK/bfmTevHlkZGSgUqmQSqUsXLiQyZMnExUVZdAvWlq8lJOTQ15eHsnJycTGxpZpcK+PWCzWqemtra2Ry+W6xCUnJydcXFzIzdVcn1qtJisri2nTprFmzRq++OILevXqVaFgCQxFSwAnwtMZ3MKTCV0D+fdaEjILMRO6BmJnZcHGY3f7cMsTLAnUPMKSdx0gJj2f/p8eokhh+Oad3rshrw0M4UZiDgM/O6zb3qORK4+19KaNnyMN3W1JyCqg+0cHDB4rk4rZN7uX2S21Cf2lVae84hvUKLOSGd+/Hc93CxaK7zJ48skn2blzp8G2w4cP071794fGWPt+8tPp6BpVw3/4VEuzuiHuteIAUen5iEXw5XPt6R3izuTvz3DwRkqlHi8SwTfjO9C1gQv9PzlkkIMOEOAi59C8PgBkZWWxbNkyPvvsM5RKJWvWrGHGjBnVHntmZibR0dEGSvqkpCRSUlLIyMgwEDAVFBRQWFhYKTU9gJ2zG86Tv9VcYBkMa+PDqtFteO2Xi/x8p5h2sbHks2fa0r3h3ejNtNwiJn9/hnPRmQaPFwGXlwysdzd6tYHwDNcBFuwI1Zm4avG0t2J6n2DyihRGxz/Z2pvHWnlzOS6LpOxCo/0ACpWaBTtCzaohWTC8rRqVK75FSBw8+OlsPFtOx9X74rssfHx8jLb17NmTXr16cfDgwQc/oDqGoIYvH22U51tDmjKgmSf/XE3C0dqSYW0MX1e/X9DEcy5+rBkyqZirCdlIJWKebO1Na19H5v5y0aiYLB3l6eDgwMqVK5k8eTKffvopAwcOvKexOzo64ujoSKtWrar82MLCQj744AOWLVum69XW9pq6uLjQedBwrpRTTAa72bDsyeacjcrg13N3Z2YLSpSEp+SSmFXAv9eTsZVJmdgtiPVj2zPqq+NE3ZnVBc3McGRaHs1L2S0J1DxCQVnLaBMUSvPWkKacj85EIhbhJDf0mvxo7w3e+E1ThG6Y0IEQE7NK5pagIPSXVg2h+K450tLS+P33303ue+SRRx7sYOowM/o0wtVWJqjhTTC2sz+bjkfSzEvjPjGgmQcDmnkYHactKK/EZzOxWyBPtvFBpVZzMTaLsRtOGtgIaVGq1DzXxfg5a9KkCV9++WUNX0nVsLKywsLCArVajUgkwsbGhkmTJjF9+vRyBUugES19O6EjOYUKXt5yFv2X07ox7VCo1Lz43Rndtr+vJnFwXm9eezSEGVvPG5yrWFH+0r1AzSAUlLWMfkOylk6Bzgxu4cnQNUdYaqKZuHQDd1mYS0Oy0F9aNYTiu2aZMWMGCQnGYpMmTZrUe/P30jzT0Z9uwa66mXG1SomoEmr4Rxq4mPXMuFa8NHbDyUoV2r+ci+WXcxWL4x4G8VKzZs3o1KkTkyZNYuzYsQbRlGWlLZUnWvJzsqZ3iDtv/HbJ4DFZBSWciUynfYCT0fkqm+okcG8Iz3ItU7ohWSyCpU80Z9uZGG4k5dzTubUNyQbblEp27NjBgAED+Oqrr+7p/A8CreGtKab3bkjk+0PZ+2pPo33t/J34+aWuXFs6iNML+rH48WbILTVfbG/vvEJMer7RY8yBmi6+t52OrpFzPczMmDGDkSNHGm23s7MT+idNoFXDPyY6T8653XjbSSn9LInQ9P2N6xzAvtk9+X5SZ7MtJrW8N7wlUnHNvl4eBvHS8OHDOXnyJFOmTDHKOdcKlvTRFy1N2nzaSLTkdie2U2LivSeViI2eY9Gd3yNw/xFmKGuR3CIF0aUKm7GdA/BxtGbshpM18ju0CQrF+Tls2LCBVatWERenWVYJCgpiypQpNfJ77hem+kuh/B7TZl72/PhiZ24n5/Lu7qt4OlgxpUcDglxseH7TabPsL4W7xXcjd1tm9W9MSx8H3GxlFJQouZWcw1eHww0ygAHGdw1gfJdA/JytycgrYVdoPCv/vqmLeRPSJqBbt25069YNGxsb8vPz8fPzw8LCAmtr69oeWp0jIiKC27dv4+DgwBcfLkalUvH7lnewcXCu92p4IcrTmNJpS2IRfP5sW9r5O5kU2IBG+a5UqXmslTdbTt294fW0t6JjoDNnIg3DGrRpSwL3H+FZrkWi0vIMFLeOcgvmDGjM6v23SM8r7ShWPdRA6+79iTx/xEB1J5FIUKlUFBYWYmVlHOX1IDh06BBjxoxh3rx5TJ8+3SiXvKz+Uii/x/S1gSFkFZTwzNcnyL1TcMZmFPDhiFb0aOTKf7dSzaq/VIu2+PZxssZWJuHXc7EkZRdibSFhUAtPNkzoyJu/XWLr6RgA3hjUhKm9gtkdmsDGoxE09LBlQtdAGrvb6TwCzbX4rghTdkAWFhZYWVlx/fr1B2II/TDy3nvv8c033xhs++effxg7dqwgikAQL5lCK1hSqtQsHNqsQtFSel4x28/E8Gwnf358sTN7riRiaynluS4BWEnFrDsYpju+tGBJ4P4iFJS1SOlG4XkDQsjML2Hz8cga/T0xcQlGFg5KpZINGzawYcMGQOMnJpFIsLS0RCaTYWVlhVwux9bWFltbW53Sz9nZGVdXV9zc3PDw8MDLywsvLy+8vb2rbCIeGhpKfHw8c+fO5fPPP2f16tUMGTJEt4xoqr8Uyu8xtZVJ6d7QlQ1HInTFJMBv52NZ9Fgzhrb04r9bqeX2l4aGhrJ//35eeeWVShn31gX0i++DN1KM7Eg2H49k14zuvNi9AVtPx+BmJ2NS9yB+PRfL3J8v6o6LSM1j2RMt6NfEnX+vJ5uduKs8KvI2tX3mY/r52xKXo6SRUE+axNXV1Wjbc889x7p16zhy5IjQIoAgXiqNVrAEVFq0tPCPy1xLzGZ0Bz9eH6jxzb0Um8ncny9ySm+GsizBksD9QSgoaxH9RuFAFznPdvJn2a6reNjdnTGUScVIJSJ8Ha3JKVKQVVBS5d/z7ddf8cEbM7h8+bJum0gkonfv3gQGBpKRkUFWVpbOSyw/P5+CggJycnKIiYlBoVBUylMMDI1utckL2sJUa3jr7OyMs7MzoaGhiMViVCoVERERPPbYY/Tt25fVq1fTvHlzk4a3FfWYhnjaYSERExqXZbC9RKnmany2bpbElOHtiRMnePfdd9m9ezcAgwcPpnHjxpV7ku8zs2fPxsLCgvnz5+Pi4mK0v6ziW4tKDfFZhbT21Vx/O38nLCRi/rwUb3DcnxfjWfZECx5v7a1bHjcXcVdZVMZeSQ1Inby4kCtiwKrDgr2SCTIyMtiyZYvJfZ6enkIxqYcgXrqLftrSM1+fqNRjlCo13x2P4rvjUWUe8zAIlswNoaCsRfQTFDztrZDcyeI2pew+Mr8v3x6NYNmuq1X6HSJgWP9uPHvxIj/88APz5s0jLS0NlUrFuHHjeOGFFyp9LoVCQVJSks7cNjExkdTUVFJSUkhPTyczM5PMzExycnIMCtOMjAxKSkpQKBRlJi9oPcr2799PixYtcPbwxu75L40MbyvqMXW/07CdnGPsz5mcU0inwLs5stFp+eQWlnD8v4O88847/Pfff7o4MLgbqVYX2Lx5MxkZGaxbt4433niDV199FTu7ux+UpopvawsJVhZi7KwsGNDUg96N3dgVqlEry+7czBSVGP49tL2TLfWWJ805baLK9kpqwV6pLFavXk1MTIzRdmtr6zILzfqMVrzUd9gYLhU40Lz/KKLTC+pllGd9T1syF+rON2Y9RL8h+UZSDlO+P2N0zNwBIdjIJCzbddXArLWy6Dckjx8/nqeeeooPP/yQVatWVTliTyqV4uPjY9LkuSoUFRWRmJjIrFmz+PPPP3Wzn9oZDF9fX3oPf47DpYrJyvSYWlloCkJTvmNFCpVuP2gKefcGzSlIuKXbpj8T26ZNG6RSKRKJRPdPKpXqtmn/38LCwuQ/7SytpaWl7p+VlRUymUz3T/uzXC7HyspK98/a2lo3uyuXyyku1lxvXl4eixcv5pNPPuHtt99m6tSpKERSI3EXwMKhTRnbOUBzXSo1e64k8vYfmlnqsBSNcrJ9gJOBt5224PZwMOyr1Yq79Jvbi4qK+OOPP7C0tGTYsGEm/x51GcFeqWZ59dVXcXZ2Zvbs2Qbvo+Li4oemdeRBkZiYiEQi4dy5cxz4YytisZhDe7+ot1GegmDJPDD/V2odR9uQnJFfwt9Xk4z2T+wWBFga7GviaUf/ppr+kkBnG+ysLJjRpyEA1xKyDZYqSzck29ra8s477/DOO+/cpyuqGJlMRkBAANbW1rovHnd3d2bOnMnkyZNxd3fnfHQGh0sZ3lamx7TwzgybKd8xmVSs26+ldbv2nNkbgUJhrBZ3cnJCrVbrlvyLioooKChAqVSiVCpRqVSo1WpUKpXu//X/3S9UKhUZGRnMnj2b2bNn492sExZPvG103LdHI/grNAEPeyuGtvJCIhLpnpcr8dmcj85gaq9gkrILOR6WRkN3W94d1oJihQqrUs+fftrEhQsX2LBhA9999x3Z2dk0aNDgoSsoBW/TmsfR0ZFXXnmFFStWEBMTg7OzM08++SQpKSkGM/8C8OijjxIaGqq7iVapVKSkpODm5lZvxUuCYOnhRygoaxn9huTK0sLbgXmPhhhs0/78y9kYXUFZ1xuSW7VqRWRkJDNnzmTEiBEGop7SBWFle0y1BrjudsbKdXc7K5JKmcJ/89V6ghw3sHbtWt59911yc3N1y/Lnz5/H2dnZ6DxVRalUUlBQoGsByMvLIz8/n8LCQgoKCnT5t9r/FhYWUlRUZPDfVatWGbULWFpa0r59ezoOGsUfBca/Nywlj7CUPAB+Ox/HdxM78c34jgxbdxSAqVvO8vmz7VgxsjUACqWKb45E0KWBMw1cbY3ON2PmLG6d+Ie4uDhd7yuAh4dx83xdpjr2SkNbevFi9yCC3WxRqtXcTMxh/eFwDtzQHFdf7ZVMzahpb6bOnz+Pv3/d/fypTRwcNEWj/o1nQEAACxcuZMGCBbU1rFpHECw93IjU93MqRaBSjNtwkmPhaTXaP6JtSH5Y7V7yihS0WLJX10/UJciZn6Z0Lfcx3x6N4NN/bnJu0QA2HInggz3XdfssJCLOL3qU3ZcSmH8nYUEEXF4yULeklJWVxcqVK1mxYgXFxcVkZ2cbGfHWFmKxWPflExgYyMKFC3nuueeQyWRcic9i6JojFZ7j2Y5+vP9UK/quPEh4ap5ue6CLHDc7GZGp+aTkFnHyzX4kZBXqCk8t8d++QklyhNF5LSws8PX1xc3NDS8vLwICAggODqZJkya0bNkSLy+ve7z6mkX7fuvRyJUXHgnkXHSmgb1S5yAXA3ulCV0DWfpEc/69nsT+a8nILMSMbOdLM28HXvrhLHuvJD7077eqUJEaXpWTQrB1AV/Oe45GJmJh6zuxsbE0bdqU3Nxco33z5s1jxYoVtTCquoW+UE6EGrWR/fldtIIlQShX+wgFZR0gJj2f/p8eoqgG80ZlUjH7Zvd6qN9cvVYc0BneOskt6BhoPFtYusf0RlIOm57vSFMve/quPEhesWaJ++kOfnw0ohUTNp7i0E2NpU6Ai5xD8/oYnTM5OZnr16/Ts6dxAk9toFarcXV1xcvLi0WLFjFy5EiDJcTSxXdZvPBIIIsfb86Ta49wMTbL5DEN3W3ZN7sXaw/cZsXfN3TbRcCCkDTeen0eKSmGlkS2traIxWLy8/NNtg6ApuiUy+XY29vrrsXPz48GDRrQpEkTWrRoQWBg4D332l28eJHBgwczf/58ZsyYYbTUeisphwGrDpf5eLEIds3ojkwqod+nhwDYP7cX2QUKgwLbViblxJv9OB6WyuTvz+q275vd02yFE5VRw2uRiECpRviSN8GoUaP45ZdfjLb7+voSGRkptAfoERqdSt8pb2PTsCMiO/d6KVh6mBCWvOsAQkOyafQNb6vSY7ri7xv8NvURtk3pytZT0Xg6WDG5RwMO30zRFZPlGd66u7vj7l53zHBFIhFxcXHIZDKT1iul0yZcbCxJKyVakopFPNXOl4JiJbeSjWdGNL8H3hzchPxiBVtOGtpx+LvImfz8UJ4bPYp3332Xjz76SNcrunDhQubPnw9oesHi4uIIDQ3l+vXrhIWFER0dTUJCAqmpqWRlZZGUlMT58+dNjkEqlWJlZYW9vT0uLi54eHjg5+dHUFAQjRs3pnnz5jRp0qRMBf6ZM2dISEhg1qxZbNq0iW+//Za2bdvq9lfVXgk0ucIRejO6oEm5yi9SUKinkjdne6Wqq+E1/xXU8MYsXboUe3t7vv32W4PtNjY2QjF5h1WrVmFvb8+mTZtI/e8/xOd/JTw6rl4Klh4mhL9GHUFoSDamOv2loBGcjN1wkjcGNWHRY83ILVKw7UwMH+ktgdf1/tLSVJRmpF98vze8JbYyKaci00nMKsTNTsawNj40dLflnd1Xyb8za7v4sWbIpGKuJmQjlYh5srU3rX0dmfvLReKz7tou6Rff1tbWLF++nDFjxvDiiy9y4sQJgz45sViMn58ffn5+DBkypNwxp6amcunSJa5fv87t27eJiooiPj6elJQUMjMzuXnzJpcvXzYpcBKLxVhZWWFnZ4ezszPu7u74+voSGxur6+8MDQ2lQ4cOzJo1i2XLlmFjY1NleyWAE+HpDG7hyYSugfx7LQmZhZgJXQOxs7Jg47G7LQDmaq8kqOFrlmbNmvH111+zadMmVCoVnp6etGvXrkb6tc0BlUrFa6+9ZrDakZ6ezsF9e+nXr1+tJbsJVIyw5F3H0J8JEBqShf7SyqK/lPt4Ky+e7uBHE087HOWW5BUpCI3LYvPxSPZduys2GdnOl4ndAglwsUGlVnMxNou1B24b2AhpMbWUq1KpOHz4MI888ohRbGZNkpubS2hoKFevXuX27dtERkYSFxdHcnIyGRkZ5OTkUFRUVKbHKWgK0EGPD+NK0xegVD/W8mEtjOyV3vztEtmFmi80FxtLPnumLd0b3k2BScstMpk1XLovFzQtC8eOHePEiRPMnj37obLQ+el0dI2unHz4VEuz+ny6F2QyGQqFgri4ODw9PWt7OHUKLy8vEhMTjbbPmTOHlStX1sKIBCqDUFDWQfR7lSqboGCuvUpCf2nlqe/Fd3FxMYMHD2b//v26bSKRCLVajVQqpWHH3hT0mmX0uGA3GzztrXT2SiUKNQv/CCU1V9M2ILeU8MagJsgtJfx7PRlbmZSJ3YJwsbFk1FfHjfxhd7/SnebeDmRkZPD999+zbt06btzQ9KNGREQQGBh4356DmkT73vN3lldKDR/5/tAyz/XfrRTGfXvKbN97FVFaDe9mBT4erixZsoS33nqrtodXp9i4cSMTJ0402m5lZcWZM2do3ty8VgDMCaGgrMM069KXRLtGtBgwmpiM+pmgAMIsSWURim/o0KEDZ89qRDIODg6MHz+eiRMn0qZNG85HZzC8lLepKb6b2Al7KwudCGfT8x1RqNS8+N3d4AEHawsOzuvN0dupzNhq2A/6hNUNLvz7O8ePHzcSKWVnZxskHNVlqqqGH9bGOPCgla8DE7sF8d5f1/jqv/CH6gblXqlIDW+lzOWJ9sG82DtEUMPr0bp1ay5dumS0/dlnn+XHH3+shREJVBahh7KOkZycTF5eHn/++SfXTh4ADrD5qzdw9/artw3JQn9p5RDEXeh60SZPnswTTzyBTCbT7TNldm+K/4Um8P5TrWjgakOJUkXvEHfe+M3wCy6roIQzkem0D3Ayevz6dZ+btFcCaNSokS7P3t3dHS8vL3x9fQkMDKRhw4aEhITg5GR8zppGoVCwcuVKRo4cSXBwsNH+W0k5/Hc7FYCDN1I4eMNQ2b/5eCS7ZnTnxe4NdAXl7xfijM7TpYEzKpWanRc1mfFKlZr/bqdyOznHbG+CK5sNXyCx5ZdLyWy7kGS2K0zV4eDBg3z11Ve88cYbBttTU1NraUQClaV+VCQPERMmTGDPnj0G2/755x+mTJlSbxMUQDC8rSz1vfj+6quvytwX6GKDCCq0V9LGc9pZSZGINf2WEhPqeqlEjFRsuF0EbP78Y5YsfJObNw3/BhKJBLVaTVxcHOHh4WVaLIFG7S6TybCxscHe3h5nZ2edz6e2AA0ODqZx48bVciQ4e/Ysb7zxBosWLeKtt95i/vz5BmKH6qjhS2MpETO4hRcnI9JJzDYUeQlqeAz2C2r4uzg5OTF79mxdQblw4ULc3d1p1EgQdNV1hIKyjiGXG9+hvvTSS+zatYudO3fWwojqDs909KdbsKvu7h+1CkRlzzppvxAfaeBSr+7+heLbNNWxV7KykKBUqXmslTdbTkXrjvO0t6JjoDNnItMNHu/vIufZUUN5ZuRwtm7dyquvvkp6ejoqlYqmTZsSGmo4e5yens6NGzcICwsjMjKS2NhYndI9PT2drKwsEhMTiYyMLLcAlUgkugLUzs4OJycngwJUazbfuHFjPD09dV6iJSUlLF26lI0bN7J+/XoGDRoEUC01fGn6hLjhYG1hNHMpqOGNqe9q+NI9pr4OMiQSCSEhIbUaEyxQNYSCsg4RHh5uNDupRVABavBzlvP9pM5s/v1vZq/9FddWvSixdKi3/aVlUbr4rqy4y9yL76raK+UXK9l+JoZnO/nz44ud2XMlEVtLKc91CcBKKmbdwTDdufXtlUQiEWPGjGHo0KEsWrSIzz//HD8/P6PxODs707VrV7p2LT8FSktWVhY3b94kLCyMiIgIYmJiSEhIIDk5mbS0NLKyskhJSSEmJgaFQlFmpry+n6larSYqKorBgwfj5+fHawsWEZXubfSYhUObGqnh3/7jcpljfbKND0UlSv532bjojE7LJ69IYaSG379/P7///jtvvfXWQ/WZJ2TDV53yekwBPF78gu7tgriVlCP0mD4kCKKcOsTmzZt5/vnnjbaLRCJyc3NNzl7WJwoLCzl16hR2dnY88sgjFBYWMmzYMH746ed6219aFpGRkVy6dInevXszcNQEwsTeNO070qQ4oD4V39WxV5KIRYzt7M/oDn4EuGiiOC/FZrJmv7HFUllJOdevX8fa2pqAgID7eHXG5Ofnc/PmTW7evElkZCQxMTHEx8dz7tw5IiMjTT7Gwj0I74lrjLZXpIbXx1Ym5cxb/Tl4I4WpW84a7Ye7avjMzEy+++47Vq9eTViYpkDfuXMnjz/+ePUv/AFSVTU8aEIExnbyZ0wnfxq42VJQouRaQjbv7LrKtcSch04MVxWqlLhk5i4m5oZQUNYh1Go1YWFhNGvWjJKSEoN9t27domHDhrU0srrBzp07efLJJw22tWrVinPnzgkJE6WYM2cOn376qc7kWyKRcP36dbz8Aut98V3f7ZVAkxn96aef6mYwZTIZzz77LJMmTaLAxpMXt12v4AzGanh9RrX3ZcXI1kz94Sx7rhj7CQI8aX2Tk39t4+zZs0bL+UeOHKFbt27VuLKaRa1Wk5GRUa7peFXV8AAfj2zFk218+O1cHOeiM5BbSmjubc/vF+I5cqfQepheT5XlXn2WhR7Tuk39+iap44hEIho2bIiPjw+RkZHY29vzyy+/kJmZSVBQUG0Pr9bx8PAw2nbp0iXc3Nw4cuQIzZo1q4VR1U20Nx9as2+lUkmjRo1o27Ytp06dKjO6sD7w3vCW9P/0UI0WlFKxiPeGt6yx891vCgoKUKlUNGvWjOnTpzN27FgcHDQCmyvxpnPeS6Ovhg8vFU35ZBsfsgtK2F9qZk6fL9auKVMN36dPH6ytrbG2tsbW1hYHBwecnJxwdXXVqeN9fHzw9/cnKCgIHx+f+/Ka3r9/P/3792f8+PF8+OGHRsvw1VHDD23pxcj2frz0/Rn2moiTBfNUwws9puZP/f1WqcNokzQOHz5M69ata3k0dQOVSsWCBQtM7hOJRLi6uprcJ2CIu7t7vS4mQbBXAli0aBEvvvgibdq0McqHr44aXh83OxldG7jwy9lYipWmPVFFwKl/d/PO4oXs2LEDwKDfMyQkhIKCAnJzc0lOTtb1hJaXhiQSiZBKpVhaWmJtba1TyDs5OeHi4oKbmxseHh74+Pjg5+dHQEAAQUFB5bYShYeHA7BlyxZ++eUX3nnnHV555RUsLCw026uhhn+xexAXYjLYezUJkQispBIKSpRGjzUnNbzQY1o/qN/fLHWE0go3R1cPhrVqJRSTeuTm5po0uwV4/fXXq2WdYq5cuHCB119/3Wh7cHAwv/76ay2MqO5R3+2VPD09yxS9VEcNr88TrbyRiEUmfSm1+LvIadOiKb/++iuXL19m+vTpHD58WLf/7NmzJuM8VSoVycnJREREEB0dTWxsrE6UpK+Mz8nJITMzk6SkJEpKSlAqjQs2fSQSCZaWllhZWWFjY4OtrS2Ojo5kZGQgEolQKpXk5+czd+5cVq1axapVqxg+fHiV1fC2MimtfR35/mQUrz0awoRHArGVSYlOz+fDPdfZraeaL0sNr1arOXHiBHv37mX+/PlYW1uXe221TUx6Pot3XqGRu22lekw/HtmKke2NBWxhybn0+/QQAG/vvMIjwa4P1U1cfUAoKGuJchVufRcgtZGyZOcVxnb2FxRugL29PfHx8YwePVo3o6GloKCglkZVN5k6dSp5eXlG2x9//HFsbGxqYUR1E8FeqWyqqobX58k23iRmFXIiwjgTHgzV8AAtWrTg4MGD/Pzzz7z66quUlJSUmQ0vFot1xXBllfFasrOziYyM1NkzxcXFkZSUREpKCmlpaWRmZpKdnU1+fj7p6encvn3bpFVTTEwMI0aMQGpli8+rWzUKGz3KU8MHOMsRi0U83sobpUrFB/+7RnahgondAlnzTFtyixQcunl32VxfDV9QUMDWrVtZtWqVzn5qyJAhdOrUqUrPw4NmwY5QFCo1Pk7W2Mok/Hou1qDHdMOEjkY9pkUlSuaXWkHIKbyrK1Co1CzYEWp2PaYPO4Io5wEjKNzuja+//popU6YAmsxXR0dHOnbsiI+PcexbfSU0NJTvvvuOzz77zEDcNWjQIP73v//V4sjqJvrvSZFahboS3qbm/p6sjhoeoIGrDfvn9ubr/8JZ/te1Ms9flhpeW8z5+vrW7AVVk8mTJ7Np0yYUCoUuF97a2prmzZvTa9hYfsk17uUrTw3fMdCJn196BIBh645yISYT0OTF//daH8JT8xj15XGD881omMPJPb/yv//9j7y8PN04AG7cuEHjxo3v75NQDsXFxfzzzz88+uijujYAffRfR6YQi2DXjO7IpBLd7OPHI1sxuIUXzZfsrfD3l/U6EqgdhBnKB4iQonDvaNXcY8aMMWmxVF8xaJtw8WfJu++zY8cOwsLCePvttzl69CjNmz/8vVj3A6236S9/H2HKiu8J7v4EqYXUa3ulRh529GjoyrHwNP68lMCfl8o2MNcnPDWPwDd3l7lfq14u6/mTy+V1yh4tPT1dN0vZpUsXXnnlFUaMGIGlpSXnozP4xUQ2fFhKHmEpmhWC387H8d3ETnwzviPD1h2lsETTAxqdnq8rJgHyi5X8ez2ZYW18jCYa3lq0mOKEu60Z+nNA7du3x8bGRmdor431dHFxwcPDA09PT7y9vfHz88Pf3x93d3ddj35NsHv3bp566ikaNmzI559/zsCBAw3230viklgEckspuUWmDf3NqcfUXBAKygeEoHCrHqX7S2MTU7Czs2Pz5s21PbRap7y2CRGgHryQ3rJ8nps2jqVLl9bWMOs0cXFxnDhxgi5dujDlmSfIyMjgrx/fRW7vVO/tlQQ1PDzxxBN4enoyZcoUo5726mTDJ92JoEzNLTI6Li23CEupGLmFhBy9Iuq9d5ex4eOlXLtmPOPr5uZGfn4+qampxMXFUVJSUq5wCQzFS1ZWVsjlcuzs7AwETK6urrpi1Nvbm4CAAPz9/Y1aEZKTNTPU4eHhDBo0iKFDh7Jq1Sqdy0R1E5esLSRcXjIQuaWUzPxidl6M54M91w3aK8w1celhpn59QtYSgsKtapSfoNCChrN+4N2/btTb/tLKtE2oAWzdiBbBgFWHzX6Jtrp8++23vP322wbb/v77b8aMGUNz77JzqusDghoeJkyYwIQJE0zuq44aPjw1j+TsQjzsrYyOc7e3orBESW7x3WJSBEwdO4K5E0fz119/8corrxAREYFarcbKykqnQi9Nbm4uUVFRREdHEx8fT0JCAklJSaSmphr0i+bm5pKbm0tqaqpOvFRRF5xEIsHCwgKZTKYrXrX//euvv/jrr7/o1q0bry9YRHR6idHjK0pcSs4p4svDYVyOz0Ysgl6N3RjfNZCmXvY88/UJg887U4lLArWH0EN5n9GmKBQpDO8ap/duyGsDQ7iRmMPAz+72mIhEMKajP2M7+xPgYkN+sZIr8Vms3n+bc9EZAGaboiD0l1aMYAxcs2zZsoXnnnvOaHvjxo05d+6cIGLi3lZX9Hnt0RCm9zGvcIZeKw5UqIbfMa0bDd1sab/8H/KLlbz9WDMmdgviuQ0nOXLHw9JJbsGh1/pwJjKDiZtP6x4f4CLn0Lw+up+Li4tZvXo1ixcvxtXVlaioqBq/JoVCQVxcHDExMbpkpaSkJF28Z0ZGhk5Jn5ycXKYosiYSl7RM6x3M6wOb8MrWc0btF9rEJYHaRygo7zOmUjk87a3YP7cXajXEZhQYFJRvDWnK5B4N+O18LKcj0rG3tmBMJ3+8Ha0Zuf4YF2OzzDJFQSiUKqamvtjnPdq4XrVNlIVarWb06NH8/PPPRvs6d+7MsWPHarTf7GHmXt+f5qqGX7Lzik4N/+Vz7ctVw284ojFxd7W1ZPcrPZBbSthwJIKcQgVjOvvj7WDNU18c5VpiDqB57sZ1DjDZI5icnExWVhaNGtXu+/ill15iw4YNKJVKJBIJKpWK/v37M3LkSFxCOjB3T8W9t+UlLmmRScVcXTqIn8/GGM2Y73j5Edr6O93ztQjcO8I88X1EP0VBn7eGNOV8dCYSsQgn+d2eFIlYxHOdA9gdmsCc7Rd123eHJnDk9b4Ma+PDxdgss0tREPpLK0Zom6h5vvrqK5PFpLW1NXv27BGKST2e6ehPt2BX3QqCWKQRVJSFdgXhkQYuZr2CMLazP5uORwKw61I8T3fw47nO/gZq+A/2XDNQw6fmFjNy/THeGtKMid2DsBCLORedweztF3TFJGg+257rYvo96u7uXie8d7Ozs1Eqldjb2/PSSy/x8ssv61LdrsRnQSUKyvISl7QUKVRk5BfjaG1sJ1XZXlaB+49QUN5HTCncOgU6M7iFJ0PXHGFpqTtPqViEtaXEqGE7LbcYpUpNoV6agrko3IRCqWK0xsCmKKt1AsBCImJyjwaMaOuLr5M12YWaL7gFO0IFY2CgdevW9O7dm4MHDxpsF4vFuhhCgbto1fC3knJ4bPaH4NWcYkt7QQ1fDTV8TEYBU7ecLXN/RWr4usLcuXMZOnQoI0aMMDJYv9fEJX1sLCU4yy1JzzP8bhTd+T0CdQOhoLyPlFa4iUWw9InmbDsTw42kHKPjixQqzkdnMLKdL+eiM3RL3q/0bURWQQk/norWHVuWwu3ChQusXbuW7t27l9lMXlcoq1AyVST5OlpzZH7fMs+19VQ0b5ppoaQ1Bi6Np70V0/sEk2fCVkMqFvHthI60D3Dip9MxXEvIxsHagjZ+jthZSUnJLar3xsBdunThwIEDtGvXjvPnzyOVSrGxsaGgoIDi4mJkMlltD7FOoVAokEqlHN61nZtblzNs2DB++OlnQQ1fj9XwHTp0oEOHDib3VSdxSSYVIxWLyCtllv9K30aIxSID03fQ3LzUt9dbXUb4S9wncosURN95I2kZ2zkAH0drxm44WebjZm2/wOfPtuOz0W1126LS8hi5/hgxGYbNz1qFm0wCf/zxB5988gnHjml80bKzs+t8QWmqUCqrSErLK2bWtgtG5+jV2I3hbX3475bmg8bcEhTKapuAslsnACZ1D6JzkAujvtT03ZrCnNomKktpGyr92Y3z58/TtGlTcnNzhWKyFJGRkTRq1Ahvb29iYjSJJjKZDBuZtN4LIgQ1fNlUNXHJ19Ga3TN7sPNiPGEpmkjPno3c6NvEnYM3kvn7WpLu3KUTlwRqH6GgvE9EpeUZTPU7yi2YM6Axq/ffIj2vbDVbXpGCm0k5nIvO4NjtVNzsZEztFcxX4zow6stjZOTftWFQA0NGT+Diwd1kZWUhuhMBJpFIsLe3v09XVjnmzZvH6dOnWblypck72Kr2lxaUKE1mA49s70t2YYkuC9bc+kvLMgYur3VCJIIXHgni76uJOhGXhUSkM1XWYi5tExVRkV+nqMcsHumejswtAIlEIix3m8DW1haFQkF09N1Vku3bt5Obm8vKlSsJCQmpxdHVPvU9G74sqtpjqvksT6J7Q1dGtPNBIhIRmZbPR3uu89V/4ehLiMvrMRWoHYSC8j5RXMomaN6AEDLzS9h8581lColYxA+TOnMiPJ0lf95dCj5yO5W/Z/XipZ7BfLDnusFjTpw6Q3GWZgZKK9hXKpV88803bNiwAalUilQqRSaTYWVlhbW1NTY2Ntja2uLg4ICDg4POzNbNzQ03NzddVq6Pjw/29vbVEiccPnyY06dP07FjR8aPH8/777+Pt7e3bn9V+0tN4WYno2sDF347F2tgy2SqUFKr1fz7778sXbqUTp06sXLlyipf0/1g06ZNvPXWW8yZM4epU6ca2dSYMgauqHWikbstng5WXEvI4b3hLRnRzgeZVMK1hGyW7brK8XBNxrK5GwNX1q9TLXchUeQi+HWWQ0FBAWKx2MA0W61Ws3v3bqZNm1bvC0oQsuFNUdUe0+xChYEgtSwelh7T+oZQUN4n9JVngS5ynu3kz7JdV/Gwu2toK5OKkUpE+Dpak1OkoJmXPU087Xl3t2EiQmRaPmEpubQPMLZGeG3ubL7+aLEusQA0SQhNmjTBx8dHZ16bl5dHQUEB6enpJCQkoFAoKmViqz2fRCIxSFewtrZGLpdja2uLvb29rjB1dnbG1dXVYCZjy5YtbN++nbfeeou5c+dibW1d5f5SUzzRyhuJWGQ0c6lfKKnVavbv38+iRYs4fvy47nrqCmFhYcTHx/Paa6+xfPly3nzzTaZNm4aNjY3JtgmouHUi6M4y7qTuQWQWFPPWDo1p8LQ+wWx6oSNPrj3K9TtqUnM1Bq5yzOmd3ULMqTGFhYX069fPZALL7NmzGTJkSC2Mqm5SWg1f2Wx4c1bD1+ce0/qGeX2L1CH0FW6e9lZI7nglmpp5OzK/L98ejdBlu0rExgWP9M4drD4i4M0ZL/L2KxP5/PPPWbx4MQUFBahUKl588UXmzJlT4TjVajVZWVnExcWRmJhIYmIiycnJpKamkp6eTkZGhkGqQl5eHvn5+WRlZZGSkqJLVygv7kupVKJUKlm0aBGLFi2iacu25A9dducKNFSmv7Q0T7bxJim7kGN3Ztz0iUrL54OVn7Lp6y+5ceOGQRGZkpLC9u3bddcPGCU+lN6u/VmtVhv8K+/Yin4GOHXqFBKJBKVSSUZGBq+//jqLFy+mX79+PDZuqpFCsjKtE/I7xaGNTMLQNSdJyNLEvR0LS+XgvD681DOY2dsvaMYCRKbl6frgVCoVR44cYdOmTfzvf/9j165dtG/f3uTvqasINlQ1S35+vlHknpYePXo84NHUfbRq+IuRyfR7aTG2jTsjsnWrt2p4oce0/iAUlPcJfYXbjaQcpnx/xuiYuQNCsJFJWLbrKlFp+VhINEXP4628DNRszb3taeBmy1Y9lTcYKtzmzJnDuHHjWLRoEV9//TUBAQGVGqdIJMLR0RFHR0eaN7+3pc/8/HwSEhJISEhgwIABFBYWGuy3sLCgcePGdOg3hIN6xWRl+0v1CXK1oZWvI98cMeyr0eftj9ZQkqwxE9Yv4q5fv87o0aOreHUPjoKCAnbt2sXfZ2/iNeETg32VaZ3Q2kudjcrQFZMA8VmFnIlKN5rpLlaoCA8P57vvvuPbb78lJiZGt7yZnZ1dcxf2ABBsqGoeZ2dnLl++zJdffsnUqVMBdDdB9yOp5WHn9ddfx9LSkl27dpF28SKyyzu5GR5Vr9XwQo9p/aD+vKJrAa3CLSO/hL+vJhntn9gtCLA02Hf4Vgoj2/thK7Pgv1spuNvLmNA1kMISJd8ejdAdZ0rh5ubmxvr16/noo4+wtbW9b9dVFnK5nODgYBo0aEBRUREikQi1Wk3Lli2ZO3cuo0ePxsrKivPRGRz84pjucZUpkkozrI2mH/P388ZCHS3jJrzA31u/IjY2VjcWgEaNGvHWW28Bd5e/tX2ipX/W7x8ViUQG/8rbZuocph7z3Xff8dNPP6FUKnVj9PX15cUXX6TzoBFM/f3uF3ZlWyeSsjVebaX9TEHjaVpaldv9kS7kxxl+0GtnU9PT0yksLMTKyjh7uK5RHb/OnyZ3oUsDF6PjD91MZsLG02ZpQ1VdunTpAmhMtW/fvs3ly5fv+SbU3FCr1axbt468vLsG3YmJiaz+ZAXjxo3D19+3FkdXuwg9puaPUFDeR/QVbpVl8ndnmNKzAY+38qZXYzdKlCpORabzyT83DVIEylO41bbCW61W06pVKxo0aMDs2bPp3r27wZJzdfpLswpKDH7HE619CEvO5XJ82TNoc2bN5JsPF7J7924WLVrEhQsXAM0XYl2xVDp69ChKpWZGsWHDhrzzzjuMHDkSiURCXpEC0e9RuqWyyrZOrPz7BsUKFR72xkWgu72MNANzYDXB7vaEllGXjxw5EtAUxdbW1tjb2+Pm5oaPjw+BgYGEhITQokUL2rZti7Oz8708FRWi9UEsi+r4dQLEZxbw0d4bBtuSsjUzu+ZmQ1UVSlssXblxG4B//vkHOzs7unbtWssjrHuIRCI8PT0JCwvTbVOpVCxYsIDbt2+zYcOGWhxd7VO6x1Qiutu/bIr60GNqTggF5X1EX+Fm6m7sma9PGG0rUqhYs/82a/bfLvO8dV3hJhaLdcWbKarTX7ps11XdtjZ+jgS52rDynxtGx2vRJiiIRCIee+wxhg4dyl9//cXSpUtp3bp19S+uhmnTpg0dOnRgzpw5PP3000gkEt2+0sbAlW2dyCtWcvBGMn2buBPsZkNYiuZGJNjNlvb+TgYG+QEuNhw6d5qrV68yceJETp6828NqbW3N/PnzuX37NtHR0SQkJJCens6NGze4dOmS0ThEIhEymQw7OztcXFzw8vLC39+fRo0a0aJFC9q0aYOfn1+1XAPy8/Px8vKiZ8+erF+/Hh8fH4P91fXrBMgpVJi0pALzs6GqiPIslsCKkLlb+S1SgrVHDo08zP/5qCrbtm0zKCa1ODg4sGzZsloYUd1DP3Fp8Q/7OHQzFUtn73rbY2pOiNSVkfkKVJuY9Hz6f3rIwNbmXpFJxeyb3euhvlvrteIAUen5OMkt6BhoPLNVukjSV34vfqwZL3QLoueKAyZV0AABLnIOzetz38b/oFiy84rOGLgsfprcBSe5pcFSbkN3W36f1o28IgWbjkUC8PwjgUjEIoau+Y+k7CIkYhHjOgfo7JVUKhVffPEFr732GgUFBYSEhHD9+nVTvxLQLOWdP3+eK1eucPPmTSIjI0lISCA1NZWsrCyKiopMirUsLCywtbXFyckJDw8P/P39CQ4OpmnTprRp04YmTZoYzURev36dpk2bIhKJkMvlrFy5ksmTJ+uK07Kep06Bzvz4YmedFVXp50n73A1Z8x8yqZj8UgkdgNHzZI5UxmJJi3a/YLFkTIcOHTh71jhSccyYMWzZsqUWRlR3USgUuLi4kJOTQ05Bcb3uMTUXhL/YfUZQuJmmOv2loLEXeqyVF+eiM8osJs0pQaE6bRMAt5NzGf3Vcd4Y1IQZfRqiUqs5HpbGe/+7puuxLN02IRaLmT59Ok888QQzZ86kcePG5f4OT09PBg8ezODBg8s8Jjc3lwsXLhAaGsr169eJjIwkNjaW5ORkUlJSiIqK0tk56SORSJDL5Tg6OuLu7q5TGavVavLy8pg6dSrff/89GzZsICQkpFp+nVqCXG24unQgMqmElJxCtp6OYfW/twwsh8zZr7PKFkt39gsWS8bs2bOHbdu2MWPGDIPtkZGRtTOgOsj333/PgQMHiIqK0on+stKSaa7nUyzwcCIUlA8AQeFmTHULpe4NXXGzs+LzA8bLSlrMKUGhorYJMN06AXAlPptx354yua+8tgk/Pz927NhR/UHrYWtrS/fu3enevXuZxygUCq5evcrFixe5du0at2/fJjY2lqSkJNLT00lMTKSkpMTocUePHqVJkyYmbaigclZUUWn5HA9P43piDnJLCUNaeDKzbyMauNowY+t53XFl+XVmZmayb98+Bg0aVCtCuHtFsFiqWVxdXZk+fTqvvvoqSqWSDz74AGdnZ3x9668YpzT79u3ju+++M9j21FNPMXPmTMaMGVNLoxKoCYQl7weI/kyAoHCDcRtOllsoVQdtoWROIgqhbQKWL1/OkiVLUCg0whqtIt7S0pKGHXuT12OmwfGOcgsOzO3N2gO3+eaIxh3BVGuAKd4b3pIxnfwZvu4o5+94wwLsfqU7zb0dUKvVHD9+nC+//JJt27ZRVFTEr7/+ylNPPVWzF32f+el0dI2unHz4VEuz+nyqCgYCJomYzi0a4O/lwdWrVyt+cD1j9uzZrFq1ymi7u7s7iYmJdSp4QqBqCDOUD5DSCjfUKqjHKQpCgkLlENomIC4uTldMOjg4MH78eJ5//nnatm3LhZhMhuvZUEH1rKi0fPNfOGM6+dOtoatBQXni1Bl+OLmPX3/9lVu3biGVSg3G9DBRlsVSWfZK+thbSdk/tzeutjJe3nKW/11OBKh3FkvlCZhcXtqMjbWIJTuvMLazvyBgusPt27f5+uuvTe7bvn27UEw+5AgF5QPGz1nOc76ZbJv/Ms2efAmHpo8QnZZfLxVuQqFUeep720S3bt1ITk7mueeeY8iQIQbJLfo2VFB9Kyot8VkFgGaWU5+XX5qsM8oHdMUkwMsvv4yvry+enp74+voSGBhIcHAwTZo0qbayvbqkpaWRnp5Oo0ZlL0GbsliqyF5Jy+wBjbG2kBhtry8WS5URMIlEIlIK4fuTUWw6HikImO5w/vx5A49OLSKRiLZt29bCiARqEmHJ+wGhVqvJzs4mPDycLl26UFxczMiRI/n555+N/N7qm8LtXvq49Hnt0RCm92lYAyOquwhtE8bkFSlosWSv7qasS5AzP00p3yOxtBWVPo09bPl7Vi8+2nOddYc0vboi4LWgRD54dykxMTFGj5HJZJSUlJQZQSoWi5HJZMjlcuzt7XF2dsbNzU1nrRQYGEjDhg1p0qQJrq6ulb52U8yYMYN169YxdepU3nvvPRwdHQ3230rKYcAq49nHNc+0xdnGUmevZGqGsrGHLbtf6cHq/beYOyDEYIZSy77ZPc32Jvhe33+CgAlSU1N59NFHOX9e06OsbV+5cOFCnbJ0E6g69adqqWW++OILpk+frossA40CFjR+g6XTS+oTQoJC5SndNiFSq1DX47YJqL5fp61MSrFCRbHSsAh85Y645NCtu/Gn/i5ypk2ZxMuTJ7J161ZmzpxJZmamLuEoNzdXtwQeERHBjRs3CAsLIzo6mri4OBITE0lNTSUzM5O0tDTi4uIoKSmhrPt5qVSKTCbD1tYWBwcHXFxccHd3x9vbG39/fxo0aEDjxo1p3Lgxcrnh3zQqKgq1Ws1XX33Ftm3b+Oyzzxg7dqxuOXHLyWijmbVOgc4MbuGps1cqi8WPNWfvlUROR6Sb3C8Ri/jhRLRZWiwJAqaawdXVleDgYM6fP0/z5s05duwY0dHRNGvWrLaHJnCPCAXlA0JbPGqLSdAkTixbtoy33nrLwNC6PlK6UFKrlIjEZT8n9aFQKo1arebnn3+mffv2fDDIl0btn6XLuNdQejSpt20TWrQ2VEqVutJWVF2CnFn9TFt2XoonMi0fK6mYgc096RjozI8no7hyJ4VJ34ZKJBIxZswYhgwZwsKFC1m3bh1OTk4630ypVEqjRo3KXW7WJz8/n5s3b3Lz5k3CwsKIiYkhPj6epKQk0tLSyM7OJi4ujvDwcIMldn1EIhEWFhZYWVlhZ2dHWloaoPmsSU9PZ9y4cbz//vt89tln9O3b18hiqbL2SkNaeNI+wIn+nxzC18na5DHlWSwlJyeTk5NDcHBwpZ6buoSQEX9vlF6F8/QNQCQS8e+//2Jvb0+LFi1qe4gCNYBQUD4A0tPTWbFihdF2ra3ErFmzaj0usS7g5yxnaR83mswfhWvX4TTqNazeF0r6xMXFMXr0aADdbFhPmySWzHu53rdNVMeGKjazgFOR6Qxs5ombnQyVWs3t5FwW7Ag1SBMyZUPl6OjI559/zqRJk0hNNZ3QUxnkcjlt2rShTZs2lTo+OTmZmzdvcuvWLSIiIoiNjSUhIYGUlBTS09PJzs6msLDQ6HFXr15lwIABiGVy/GZvQ99iqTL2SjKpmAVDmrLhSASxmQVlFpRgaLGkVqs5cuQIa9eu5ddff8Xf399kkkxdpqoCpmm9gxnQ1AN/Zzm2MinxWYUcuJHM5wduk55XDNQPAVO5qUuy3gTPassXJ1MZ21kuiJbMhPrzjVOL5OfnY29vb/KLZ/Xq1UIxiWb2LTY2li5dulCSloLy1E8c+vOzel8o6ePi4qL7f+1s1fLlywkLC+OTTz6hubdbbQ2t1qmOX2dsRoGB16QpKoo5fdBCAnd3d9zd3cv19bS2ttYVlWKxGJVKRZMmTejatSsBbbqxMeFuMekot2DOgMas3n9LV+yYYlrvYCwkYtYeLDsSVosauBKdzJl/fmf16tXcuHFDdwP0MK7EVFXA1NLHgasJ2fx5KZ7cIiUN3Wx5ppMffULcGbL6PwpKlGYtYKpU6pJIRInMURAtmRn185v5AePr68vt27dxd3c3KiqdnJxqaVR1h5MnT9KrVy9EIpHuizAnJwe1Wl3v+0v1iY6O1jWwa1EoFPzwww9MnDiRPn0e/qjJe0GwoYKCggLde8jNzY0pU6YwadIkgoKCADgfncFGPYulytgr+TpaM6VHMG/vvGwymtIUPXr1oTjh7hKx9gYoKSmJUaNG6fpB/fz8dD2hvr6+D1QNr1ar+eCDD+jSpUuZ752yMuLLy4d/ecs5o+PPRWew/rn29G/qzp+XEsw2I15IXarfCAXlA0IkEuHt7U1qaioikYiNGzcik8kYMGBAbQ+t1snOzqaoqMhgW0FBAXPnzuW9997DysqqjEfWHy5cuEDfvn1Nijg2btxY74tJEGyoQDM7+dFHH9GoUSOGDh2KhYWh9ZG+xVJl7ZVmD2hMYnYhx8PT8HXULHW72ckAcLGxxNfRmrisAvRfmt6e7kQmGPccZmdn88svv5Q5fm0/qFYRb2dnpxMlubq64unpqStEg4KCaNCggcHMfVVIT09nwYIFAIwcOZJPPvkEPz8/g2PuRcCkT2yGRjBmb3X372FuAiZBtCQg2AY9QIKDgwkPD+eHH35g7NixtT2cOoFaraZDhw6cO2d8Vw9w6tQpOnbs+IBHVfd4/fXXTfbhtm3btsznrr4i2FCVjb7FUmXtlZp52dOlQflFW6ule8kuvJNiBFxeMpAbVy7x8ssvc+rUKUQiEWKxmOeff56vvvqK1NRUwsLCdNnu8fHxOiV8eno6mZmZ5Obmkp+fT1FREQqFokxFPGiW9i0tLbGyssLGxgY7OzucnJxwdnbG3d0dLy8vfHx8DArR2NhYQkJCAE12vIWFBYsXL2b27NnIZJqCudeKAzr3ANAImHa/0oNz0Rm89fvlctOXnOQWSMViAl3lzB/YhDZ+jgz87DBhKXd9GANc5Bya9/DfDAqpSwIgzFDeN0z1/llbW9O9e3ehmNRDrVbTuHFjk0XR448/LhSTd3jvvffo27cvzz33nE7FC1BcXHbfW31FsKEqG32LpcraK9lZSXG2MVzWbexhx7xHQ1h/KIxz0RkGS+H+LnJsZFLatWvH8ePH+f7775kzZw7p6ek4OzsjFot1vaBdu5Zf0OqjUCiIiYkhPDycqKgonSApOTmZ1NRUMjIyyM7OJjc3l4yMDG7fvl2mMr40SqUSpVLJm2++yZIlS3j66acZ8uRTRKcbzvBWRsAE4GYr4/Rb/XU/x2cW8Oq2CwbFJBhnxGdkZLB582Y2bdrEwoULGTlyZKXGX5tURbRkZSFmVHs/BjTzoImHHXKZlKi0PLaeiubHU9Fo36r1QbRkjggFZQ1SnqpNBMgGL6RZI1duJeUIqrY7iMVitm7dSkpKCv/++6/BvoYNzWt2qCqYuiEZNGgQzs7OpKWlMW/ePP7991/c3d1re6h1EiO/TtSoKTvWrT7ZUGktliprr2SK7DspQxdjMw2O07dYAs37e8KECQwbNoy1a9fy+OOPV3vcUqmUoKAgXT9oZcnPzyciIoKIiAidL2hCQgKXL1/m9OnTRscXFRWxZcsWfj90Bucxd1cFKitgAsgsKGbsNyeQWUho7m3PoOaeyC2NBUlq0LzPk8JZu3YtP/zwA8XFxajVam7frlgAVReoimjJ31nO0sebczQslW+ORJBbpKBnIzfeHdaStv5OzP35IlB/UpfMDaGgrAEqo2pTA4VSO/ZFFbN31WFB1VaKZs2a6QrKOXPm8NRTTz2UfnX3QkU3JH7OcnJDBjPlyWdZsWJpbQ3zocHPWc4QeTjbvp7PU/M/JUHkLNhQUT2LpcpiymIJNFnn2n7FB41cLqd58+Y0b27Yq/j9998zfvx4QNO7KZPJGD9+PNOmTaN169acjUxjxJd3nQGqkg9folRzNEyzkrD/ejJHb6fx28uPkJZXzP7ryQbHdu/Zm8ywC0aCO+1Ma20KNzMyMvjuu+8YP368yXFUVbSUklPEwM8Ocys5V7ftx1PRfDSiFU938GP1/ltEpeWbrWjJ3BEKyntEULXVDCkpmlSSRx99lI8//liX6lEfqOwNSXR6PrIWA9iLiHEbTgo3JGUQGhpKRkYGYrGYcePGoVQqeWtQY1q2bCnYUFGxxVJpeyVTnIhIJ/DN3QbbKrJYqmuUlGhmWRs3bszMmTN57rnncHC46yhhZXn3dXGv+fDnojNIyi5kWBtvo4IyLycLwKhHdPny5SxfvhzQzPTqi5W0CUqOjo64urri7u6Op6enrk80MDAQPz8/I1FWVfn999+ZNWsWS5YsYcWKFUycONFAiV9V0VJGfgkZ+cbP0d4riTzdwY+GbrZEpWl6Vs1NtFQfqF+fpDWMoGqrHmX1lzo4OPDXX3/Vq2Kyqjck2mVb4YakbObMmcO+ffsMtuXkaBJgBBsqDYLFEjz77LN07NiRFi1amPzMCXSxQYTmZs7T3grJnSxuU8ruI/P7lpsPD5ri087KsMATAft+38rsGdOM+sjHjx+PXC4nOTmZtLQ0MjMzdT2iiYmJREdHlxvfCZqZV4lEgqWlJdbW1jrBkqOjI05OTri5ueHp6YmXlxe+vr4EBAQQGBiIs7MzoFHCi8ViMjMzmTx5MmvXrmX9+vV07qxZiq5u6lJptK4BGfl3WwnKS10SqJsIBWU1EaK4qkZFy7ly98H0mtOX8NT8etNfKtyQ3B8yMjKMts2ePZv169c/cCPyuopgsaSxWGrZsuwCuDoCJmsLCWrUFJYY5sMPau6Jo9ySS7FZBtv9XeT07NqZ06dPs3nzZubNm0d6uiYnfdasWZV6vapUKhITE4mMjCQmJkYnVkpKStKJlbKyssjJySE7O5uUlBSKi4sNYoBNIRaLEYlEqFR3r+XChQt06dKFoKAgZr/+JlHp3gaPqaxoSR8LiYiJ3YKITs/nYqnnp7RoSaBuI/yVqoFW1Vae7cbwdUc5H5MJwE+Tu5i03Th0M5kJGzVN4eaqaqvscm6eSM7lIhsG1JP+UuGG5P7w0UcfcfbsWaPtp06dYsWKFfz444+1MKq6yTMd/UnNLaoxiyVzfP1VVcDUzMueHyZ1ZteleMJS8lCp1bTycWBYWx9i0vPZeCxC91h9AZNYLOaFF15g+PDhLFmyhB07dhAYGFipMYrFYry9vfH29q744FLk5+cTGRlJVFSUQY68dlb08uXLBq4SWiIiIpi7+H28J67RbauKaEmfpU+0oLGHHc9vOmX0/aAVLQmrCg8HQkFZDUqr2jYejTC6s4pMM7SHiM8s4KO9Nwy2JWXfzdw1R1Wb0F9qmqrekAjZwJXn2LFjJrf7+/uzbt26Bzyauo++xVKJUkVVVsDN3WIJqi5gSsgqYM/lBB4JdmVEO1+kEhFxmQV8dzySzw/cJlOvf7CsjPhVq1axatWqGrqC8pHL5TRr1oxmzZqZ3P/MM8+wfft23Uylvb09L774IlOnTiVFZcOYTXejS6siWtIypUcDxnTy5+O/b3DwRorJY4oVKpPbBeoeQkFZRUyp2k5FpvO/y4nlPi6nUMHvF+LK3G9uqjZhObdsqnpDUt+zgavCjh07eOONN/joo48Mtg8ePBhHR8faGVQd55mO/jzSwIUec9ch8mpWdv7yHeqTxVJVBUwZ+SUs+P1yhed9WARM+fn5qNVqWrVqxauvvsro0aORyzV/7+L4u59Z1REtjWznyxuDmvDDiSg+P1C2RZJ+upNA3UYoKKuIKVUbgI2lhEKFqsIPYplUXGYerrmo2oTl3LKpzg1Jfc4GrioikcjADL9nz57k5+cbWcYI3KWwsJDRj/Un+sQJnhj3Em1HvsKBm8mCxdId6rOA6ZNPPuHtt9+mffv2RsKlexEtDWjqwQdPtWTPlUQW7Sy7ABfd+T0CDwdCQVlFSqvaAFaMbI2tTIpCqeJ0ZAbv/e8aoXGGM05BrjZcXToQmVRCSk4hW0/HsPrfWwYzVWWp2vLy8vj++++5cOECa9euRSIxNsitK1R1OVcfeysp++f2xtVWxstbzuqKLHNazr2XGxJ96kM2cGUw5RgQFhYGaPKZtct1AsZs3LiRq1evsn//fp3CuE+7Jsx6ojlLaC5YLN2hPguYyguXqI5oCTS2QmuebcupyHRmbbtAeeHP2tQlgYcD4S9VBXKLFETr5boWK9X8FZrAgRvJZOQX08jdjsk9GvDzS10Z8cUxriRkAxCVls/x8DSuJ+Ygt5QwpIUnM/s2ooGrDTO2njf4HfqqtsjISNasWcPXX3+tsz15//33a9XotiKq01+qZfaAxlhbGBfLD9Ny7qVLl9i2bRsTJ040acxe3RsSMM4GVihVnIi42zBfX2w2KkykKgmg4dNvsvyzN4RishzWrFnD+fN3P39EIhHZ2dm6nwWLpbsIAibTVFW05ONozTfjO6BWw1+XExnS0svg+OuJ2VxP1HzXlU5dEqj7CAVlFYhKyzP48joXncG0H+9alOy7lsxflxPYM7Mnrw8K0Sm45/92yeA8O87H8d7wlozp5M+GIxEGs3VqYO6SDzi2ezuhoaGIxWID2wZ7e/v7cWmVIjY2lkmTJvHyyy/z5JNPGn1ZV7e/FKCxhy3PdQ5g9f5bzB0QYrCvouXclJQULl68SP/+/Y32PWj++OMP3nvvPd5//32GDx/O/Pnz6dSpE1D9GxKofjawOVHpRCoLO8TB3Xj0s//qhWNAdTh69CihoYYzbmq1mlWrVtGtWzf69etXSyOru8zo0wgXuSULfruASCylKlIRcxUwVVW05Odkjb21ZlXl3SdbGO1fte+mrqAsK3VJoO5ift8695HKqM2i0vL551oiA5t7IhZRpmrym//CGdPJn24NXY2Wfzdu/p7iBM2dsH4xCSCTyZBKpVhYWGBlZWVgVmtvb4+joyPOzs64uLjg5uaGh4cHXl5eeHt74+fnh41N9ftRTp06xd9//83ff/9Nr169WLNmjYGP270s5y5+rDl7ryRyOiLd5H5Ty7n5+fmsWrWK5cuXk5+fT0pKCq6urtW+vprAyspKdxOwc+dOfvvtNzp37sxLL71EYNvu1bohgapnA2tnltRqNceOHeOHH37gzz//5JtvvmHQoEH36/LvG1V1DNDuNnfHgOqyefNmFAqF0faMjAwOHDggFJRlcHjTB8Ru3cHARZu4nKqs9wKmqoqWTCUsmeJhES0JGCIUlFWgsmqz+MxCZFIJckspuUXGH9oA8VkFgMa7qzTr1qzmq4/e5tSpUwb5rpaWlnTu3Jns7Gzy8vLIy8sjNzeXtLQ0SkpKUCgU5aYmaBGLxUgkEl2Ul7YotbGx0RWlTk5OuLi46GK9vLy8uHz5bvP0kSNHaN26NVOmTOGdd97Bzc2t2su5Q1p40j7Aif6fHMLXydrkmPWXcxUKBZs3b2bBggWkpKTorjk3N7fCglKlUpGbm0t6ejrp6elkZmaSlZVFdna27l9ubi65ubnk5OSQl5dHfn4+BQUFFBQUUFhYSGFhIUVFRRQXF1NcXKx77hUKBcXFxbqbAO0X9smTJzl58iSWXo3xmvBJueMr64akKtnARQoVV69eZcuWLXz33XfExsYikUhQKpUmTb/rOoJjQM2zbt06EhIS2LVrl8H2xo0bs2zZsloaVd2loKCAOXPmsH79eiwsLNg1d9Dd1ot6LmCqz6IlAUOEgrIK6KvaysPfWU5hiZK8YtPFpPYYgPRcQwNYEfDMY/2YNGIg//77L6+88grXrl3TPMbfn8OHD1c4zuzsbF1agjYxISUlRZeaoB/hpS2YsrOzKSkpoaSkxGhW1BTalIUvv/ySL7/8klbtOpL16Nt3rqDyy7kyqZgFQ5qy4UgEsZkFZRaUoGk5GDP+Bf74dTv5+flG+zt37oxarTYo8JRKJSqVCpVKVali2xQikQiRSKQrxCUSiW6W2MLCArlcjqWlJVZWVuTk5BAZGWnwWLVaTcuWLXl22mt8GVXx76vMDUl52cCPdO5IUWKYwTbt36uwsBCFQoFU+nC89QXHgPuDVCqlQ4cOBgWlhYUFrVu3Nshqru/cvn2bxMREJk2axM2bmtdho0aam5JGHnYsEQRM9Vq0JGBI/XjF1xD6qjYAZxtLo0SApp529G/qwaGbyajVYCuTUqxQUaw0LNJeuTNTcuiWoZmrvqqtX79+XLp0iW+++YY333wTf//KfRHa29uXa1ZbGYqLi0lISNAVpomJifz6668cPnzYqOCUSqWI7NzRFpNQ+eXcab2DsZCIWXuwbB+yu4j49e/DFJsoJgGKioqQy+UGBZ52Bla7XS6XY2trq2sTsLOzw8HBAXt7exwcHHB0dNTN0Do6OmJpaVml523r1q2MGTNGNyM4dOhQPvzwQ5o1a0ZekYKvluytkRsSMJ0NDGp6d2jOP39FmLwxmDhxIhMnTsTCwgJbW1vc3Nzw9fUlODiYli1b0q5dO9q3b4+VlZXRYx80Men57L6UQOT7Q03u17oFWFmIGdXejwHNPGjiYYdcJiUqLY+tp6L58VS0QduJOTkG3Cvx8fGAppDcu3cvHTt2rNMOEg8apVJJy5YtKSwsNOgXN/U5XN8FTIJoSQCEgrLKaFVtSpWaz59tS2GJirNRGaTlFdHI3ZZnO/lTWKLkgz2aVJwW3vasfqYtOy/FE5mWj5VUzMDmnnQMdObHk1Fcib8rvDClapNKpUydOpVx48aZ7Hm6X1haWhIQEEBAQIBuW2RkJIcOHdIVSwMHDmT27NkMGDCAi7FZDP/CdEqJltLLud4O1kzpEczbOy+X6c1ZmuOnzpB89SQffvghBw8eRCqV6p6XXbt20b179+pfdA3g4qKJ2GzTpg2ffvopPXr00O2rzg1JVbOBA1xs2PPnH8THx/PSSy+xa9cu3SypRCJh/vz53Lx5k4iICBITE4mNjeXWrVvs37/f4DwSiQRbW1tcXFzw8fGhQYMGNG/enHbt2tGxY8d7FoetX78eKysrJkyYUKYSe8GOUJR3ZpXLcwvwd5az9PHmHA1L5ZsjEeQWKejZyI13h7Wkrb8Tc3++qHvMw+QYUFOUNXsWGRmJSCTi2LFjdOjQobaHWedYvHgxhYWaNDP91Y26cLNVF9FPXVLcaTWpNColMksLsxMt1TeEgrKK6Kva/r6axLA23rzYIwhbmZT0vGL2XEnks39v6Ty3YjMLOBWZzsBmnrjZyVCp1dxOzmXBjlB+PBVtcO7yVG33IqapKezs7JDL5UycOJEZM2bQuHFj3b7q9JfOHtCYxOxCjoen4euoWep2s5MB4GJjia+jNXFZBQY+ZTKpmEGDBjFo0CDOnTvHihUr2L59OyqViqKiopq72GrSv39/Lly4QKtWrUwWSlW9IQlytalWNrC3tzc7d+5k69atTJs2jaysLHx8fFi+fLnJcScnJ3Pq1CkuXLjAtWvXCA8PJyEhgeTkZCIjI/nvv/8MjheLxcjlclxcXPDy8qJBgwY0bdqUNm3a0KVLlwp7WRcsWEBGRgY//PAD3377rdGsj9YxoEuQM1C+W0BKThEDPzvMreRc3bYfT0Xz0YhWPN3Bj9X7774f64sBfEXWSv7OciLlLZm+oJdQTJbBE088YfL9cuDAAVJTU2tdAFgXeaajP92CXSt0Y9Ci3V8YfQnL67t58q0DD3C0AjWNSF3dxrJ6zLgNJ8tUtVUXraqtLs+cqNVqFAoFFhbGQqK8IgUtKrGcu25MO/o2cafp4j1sfbELXRq4lHt8q6V7yS7UzECKgMtLBhr1JkVGRrJz504mT56MtXXZPZh1gVtJOQxYpemDff6RQIa18SbAxUZ3Q3I0LNXghsRJbsFrj4bQKcgFLwcrXTbwgeuaLO8MvWxggH2zexoVSomJicycORM/Pz9WrlxZrXFnZ2dz+vRpzp07x9WrVwkLCyMuLo60tDRyc3N1PZpaRCIR1tbWODk54enpSVBQEE2aNKF169a0atWKkBCNNZRUKsXS0pJPP/2UyZMn64rwJTuv8P3JKDoGOPHTlK68vOUsh2+mVMn8vV8TdzZM6Mikzaf5V6/PVCIWMa5zgFkawFfGWkmLVvQlWCuZJiMjA2dnZ6PtVlZWhIWF4e3tXQujenioimipZ5sQEhIS8PHx4ddff6Vz57r7PShQNkJBWQ1i0vPp/+khimowtF4mFbNvdq+H+kO914oDFS7n/jG9O4duJjP5+7N0CHDC2cawR7Gxhx3zHg1h/aEwzkVnsP96ss4qJsBFzqF5fR7MxdxHzPGGpLCwkLNnz3Lu3DkuX77M7du3iY2NJSUlhdzcXEpKSio8h5+fHytWrODRRx9l2DcXiErP1yUu5RYpKmX+rs8zHf344KlWPPXFUc5FZxrsM5fXkj761kpVeW1pPRIFayVDEhISjIpGS0tL5s2bV+ZMv4BpKhItTZo0iW+//RbQ3IzOmTOHd955p85PEAgYIix5VwNB1Waaqi7nnokytrDJLtAUHhdjMw2SF8wpNcEcbTasrKzo1q0b3bp1M7lfoVBw6dIlzpw5w65du/jzzz+NjomJieGZZ55BZmOP1ys/AlUzf9fHQiJiYrcgotPzjXovwbQB/IULF/jpp58YM2YMrVq1qs7TUGsI1ko1j7Z/EjSv7y+++KLcnl+BsqlItOTp6anz71Wr1Xz66afs2LGDLVu20KVLlwc4UoF7QSgoq4mBqk2thnv4kDEXVVtV+0urgjmlJtTHGxKpVEq7du1o164darWaP//80+CLuU+fPvTv358uXboQna1i8QnNl3lVzN/1WfpECxp72PH8plNlJupEpuXhZyvixx9/ZP369Vy8qBHvODk5PVQFpWCtVH3Kmzk7deoUAG5ubpw4cYIGDRrU5lDNGgcHB4PPA5VKRXh4OLNnz+bo0aOCldVDglBQ3gPTezfkh2++IN6rO1JLWZmpOKYwxygu/dSETcci2XQsssrnMJWkYI6pCfXZZiMvT6PObt26NRMmTGD06NF4ed3N9D0fnQEnynYMqCiNakqPBozp5M/Hf9/g4I0U0ycBnhr5NGGn/jXq/3R3f3hmwmPS81m884quNcAUWnslgB6NXHmspTdt/Bxp6G5LQlYB3T8yFEKYu7VSZQRLfULcObJ9F/7+/ty4cUNQdt9nHBwcjN6H7du35/LlyyxfvpxFixbV0sgEqoJQUFaTq1ev8swzzxAaGop70B56vbWxSqo2c43iMsfl3PvFvdhsPMw3JNOnT+fpp5/G19fX5P7KOAaUZf4+sp0vbwxqwg8novj8QPnephFht4y+xACmTp3K66+/joODAy4uLnh6euLj40NgYCDBwcE0adKERo0aVdmjtKokJSVx5MgRhg0bVqY/5IIdoboeYyjfXgngydbePNbKm8txWSRlF2IKc7VWqmwWfFR6vqZ1p/EztO4+npR8FX5CPXlfcXR01P2/hYUFJSUlnD17FtCYyws8HAgFZRXJz89n2bJlfPzxx7ovo5GD+7B2Umchiov6uZx7L1TXZuNhviGRyWRlFpNQuUQqU+bvA5p68MFTLdlzJZFFOy+X82jN+3HBK5P54N2lFBcXG/gM+vj4UFhYSHJyMlFRUWX6v4rFYiwtLZHL5Tg4OODs7IyHhwc+Pj4EBATQsGFDQkJCaNKkSbVmuNavX8+SJUto3bo1GzZsoH379gb7tdZK+pRnrwTw0d4bvPGbpgjdMKEDIR7Gn0PmaK1U1Sx47f4rqSVCFvwDoH379rRq1Qq1Wk1oqOF3R2ZmZu0MSqDKCAVlFdizZw8vvvgiCQkJuhQSkUgkRHGV4pmO/sSl5bDmUKTQX1oJ/JzlfC/ckOjQN4CvjPk7QKdAZ9Y825ZTkenM2naBirwr/F3kLJn3Ji9Nep5Zs2axfft2nQH84cOHjQre5ORkrl69qjOFj46OJiEhgZSUFDIyMkhLSyM2NrZMNbtIJNIVn/b29jg7O+Pu7o63tzcBAQEEBwcTEhJC06ZNsbW1BTQqY7FYzOXLl+nYsSMzZszg3Xff1ZnKbzkZbfIGxMZSUqa9UnJO5bxaJWIRP5yINgtrJUGwVPdp2LAhTz/9NAsXLjTal5FhLN4UqJsItkGVRK1W4+vrq4sr02fr1q0888wztTCquodSqeSnn37ihRdeQNa0D16Pv4pSXfGMgD4P83JuTVGfb0jgrg/l9xM7mXQLUCjVDP/iGGEpufg4WvO/mT2wkIhZ/r9r5BYaziheT8zmemKO7mdTPpR///03U6ZMISkpiaysrHtazs7MzOTKlSvcvHmT8PBwoqOjiY+PJzk5mYyMDLKzsykoKKCkpMRkvrxIJMLCwgKVSmUwO6r19pwyZQqzZs1i3PYwotMLAKplr6SdoSzdQ6mlLGulS5cuERsby5AhQ6rz9DxQfjodXaOrJR8+1bLefibdbxQKBStWrODtt99GpVLpJm2aNm3K1atXa3l0ApVBKCgryahRo0hMTKSwsJAzZ84Y7Dtw4AC9e/eunYHVERQKBT/99BOLFy8mPDwc0KS1nAi9VeXlXMFoWUBrAF8Z8/fyBCkAq/bdZNW/twy2mTKALywsJCEhgaCgoJq/oDLIzc3l2rVr3Lx5k7CwMKKiooiPjycpKYkrV65QXFxs8nEiS2v8Z2/Xzf6383fixe5BRvZKcktJmfZKFRWU+kECxcXF/Pbbb6xevZrjx49jYWFBUVFRnbbQ0foFt/VzrJRgCTTP45uDm9DC24HcohJ2hSawYu8NXTSsOfgF13WuXr3K+PHjdT2UdnZ2ZGebtgcTqFsIBWUlcXZ2JiMjQ5djLZVKUSqVqNVqrl27RpMmTWp7iLXGzz//zPz584mIiNAtGwK89tprfPTRR0DVUhPMeTlXoPKYowF8VfD39ycmJkZXtFlYWDBgwAD69euHnV9T3j1rLCjSJ8BFzp6ZPTkVmWbSXqmighLg4/4unN33B19//TVpaWk6r0AHB4da7W0rKioiJyen3PhD7etHm7ZkSrB06GayLm2qmZc9v738CLeTc9l6KhpPByum9GjA8fA0nt+kef4eptfPw4xSqWTlypXMnz8f0NzsyWQy3f76voJTVxH+ApVAoVDoPjy1Qhx/f38aN27MhQsX8PPzq8XR1S5KpZKpU6eSnp4OYLCE17p1a93/C/2lAlWlvjsGaGdlmjdvzssvv8yYMWN0atjz0RlwtmxrJajYXqkyjB03geKEu/2H2mXI3NxcmjVrphMjubq64u7ujpeXFz4+Pvj7+xMYGIiHh8d98RD87LPPWLBgAa+++iqLFy/W9ZVqqY5g6bWBIWQVlPDM1yd0zgGxGQV8OKIVPRq58t+tVLMULNVFJBIJr7/+Ov7+/owdO5Y1a9bw5LiXKmX3NLazP41MiM0E7j/Ct3glSElJMep1Cg8PJzw8nLCwMGxsbGppZLWPRCLh0KFDDB8+3MjeoU2bNiYfU1FqgoAACI4B27dvx9nZmfbt2xstLVfGWgnKtleqLP169+LfXyNNLr1HRUVRXFxcpgpei7Yn1NLSEmtra2xsbLC3t8fR0REXFxfc3Nzw8PDA29sbX19fAgICCAwMxM6u7KIgMjISlUrFqlWr2Lx5MytXrmTcuHG64rWqgiVbmZTuDV3ZcCTC4Hn67Xwsix5rxtCWXvx3S1OgmpNgqa7zzDPPcDMujV05Hny+6nCl7J42HY8U2qZqCaGgrASJiYZ3tVKp5mlbsGABgYGBtTCiusHQoUMRiURs2rSJjh07GhSUFhYWhISE1OLoBMyB+mwA/+ijj5a5rzLWSmDaXqmyiICfN66jZN1HvP3226xduxaRSIRSqaRv3778/fffumOLi4uJiYkhMjKS2NhY4uLiSExMJDk5mbS0NJ0YKScnh4yMDBISEigpKdHNeJaFRCLBwsICmUyGXC7H1tYWe3t7YmNjUavVqNVq0tLSeP7553n//ff5+OOPGTJkCAduJBsVHitGti5TsBTiaYeFRGwkYCpRqrkan21wA6xUqTlwM5klCAXl/ean09FsyWxwx+6pYq9e7f5j4WmC3VMtIBSUVNyPUbqg7NGjB+vXr6dx48YPeqh1huLiYv7++28UCgUNGzYkKyuLkJAQ5s2bx/Tp02nWrJmu8BYQuBfqqwF8eehbKwGVtleqCv4ucs3noMyR1atXM2XKFKZPn87hw4dxc3MzONbS0pLg4GCCg4Or/HuysrKIjIwkKiqK2NhYEhISSExMJDU1lbS0NDIzM8nOziY/P5/4+HgiIyNN2jPduHGDxx9/3EiwVJk8eHc7TX9eco6x2XtyTiGdAp0NtpnKgheoWQS7p4ePevtuqGz81tjO/mzatAkAKysrNm7cyOjRo+u0uvFBcP36dd1SV1aW5q5+zJgxTJo0id69e1c48yAgUBWqagCv7Rl8mA3gK6JPiLsm0UWl5vNn25q0VyosUfLBnhu6xzS5U2QCBDrbYGdlwYw+DQG4lpDNv9eTAU0h3qexYQRlixYtOHjwIHv37q1RJbyDgwOtW7c26LmuiDZt2uiy17VCSXd3dzp37kyH/sP4NuHu53Nl8uCtLDRJIIvTPAAAkZhJREFURMUK48+tIoVKt1+LNgteaN25Pwj59A8n9a6grGr81qbjkahk7fFocJlrZ47g5OT04AddB9F+mOuzePFirl27xtatW2thRALmTmUN4BWZCagSr7Hvi8U09rQv63QPPWM7+7PpeCQAf19NYlgbb17sEaSzV9pzJdHAXgmghbcD8x41bEXR/vzL2RhdQalUqXmui/EXsEgkYtCgQffpiiqPVgQokUgYOXIkM2bMoFu3bohEIs5HZ/DtF1UTLBWWaMSWpnpTZVKxbr8+popPgXtHm09fmum9G/LawBBuJOYw8LPDuu1SsYjpfRoyop0vHvYykrKL2H4mhi8Ohem+3809n76uUK8KyurGb4m9mmD/7Ar23s7hmY5CQQmaglLfIkgqlaJQKIRlboH7TkWOAV5uzuTk5LBUnsjmzZvJy8vDwcH8ZpIaedjRo6Erx8LT2HQskk3HIit8zC/nYvnlXGy5x2itceqyinn69OkUFxczefJkPD09DfZVR7CkTRBytzOOyHS3syLJRMJQZX+PQNUonU8P4GlvxfQ+weSZEJatGt2GIS282H42htDYLNr6OzLv0RC8Ha1ZsEMj6DPXfPq6Rr359r+XfgzEEoqV9acfozK2Pn/99ZeB8n3QoEEsWbLEKG9YQOB+YsoxQHtT8+OPP/Lnn3+Sk5PDrVu3aNiwYW0M8b5SX62VtP6EpqiOYOlmYg4lShUtfRzYHZqgO8ZCIqKZtz27LyUYPFZ05/cI1Cym7J4A3hrSlPPRmUjEIpzkd1OsWvk68Fgrbz779xaf7tN8v285FU16Xgkvdg/iu+ORXE/MEeyeHhD1oqAU+jEqpio9pe5WKq5duwZoCsnly5fTrl27Whm3gICWkpIS1q5da5D9m5OTU84jHn7qu7WSKaojWMopUnD0dirD2/qwZv8t8u4k4wxv64utTMpflw0LSp1gSaBGMWX31CnQmcEtPBm65ghLS1k1dbwjlvrzkmEk8p+X4pnSswGPtfLmeqKmh1iwe7r/mP07onQ/RnNve2b1a0zHQCdkUgnR6flsPR3NpmORWFmIGdXejwHNPGjiYYdcJiUqLY+tp6L58VS0zhjYnPoxqtNT6lSYiNzdny9WvMP48eMf/KAFBExw6NAhZs+ebXLfzJkz2b17t1mK6eqztVJZVEewtOLvG/w29RG2TemqS8qZ3KMBh2+mcOhmiu44U4IlgZqhtN2TWARLn2jOtjMx3EgyvjmUSTRtB6V7XAvu/NzS524PtWD3dP8x+yYQ/X6MHo1c+e3lR3C1tWTN/tss3XWF/deT8LTX9M34O8tZ+nhzRMA3RyJ4769rxKQX8O6wlqwYeVeBqO3HeNj56XQ0/T89xLHwNKDyPaWZVh54v7gOy6a97/cQBQQqTb9+/RgxYoTJfWfOnDHr2coZfRrxwVMtkUnFSMRVK5olYhEyqZgPn2rJ9D7m0RYwtrO/7vPq76tJONtY8GKPIN55sgWPtfJmz5VEHl97hLCUXN1jrsRnM3bDSQpLlCx6rBnPdvJn25kYXt5y1uDcZQmWBO6N3CIF0en5BtvGdg7Ax9Galf+YvlkKS80DoEOAoa2T1ubJw96wJ1Zr9yRwfzDrGUr9fgxbmZRPRrXmwPUUXv7xrElftpScIgZ+dphbyXc/ZH48Fc1HI1rxdAc/Vu/XKCbNoR/jXnpK1YgoUVFvekoFHg60CuRff/3VYHvz5s05e/asQRawOVJVayXtfnO0VqqOYAngTFQGI788Xub+h0Gw9LASlZZn0GrlKLdgzoDGrN5/y6hlQcvBG8nEZuTz1pAmFJQouRyXRRs/jSinRCnYPT1ozHqGUtuPAfBka2/c7KxY8fcN1GqwtpBQevUrI7/EoJjUsveKxti8oZutbpu2H+NhpKZ7SredfjifBwHzo23btowaNcpgprJRo0ZmX0xq0Vor/TOrJ+M6BxDgIqf0fKVarSbARc64zgHsm92T7yd1NqtiUst7w1sireJsbUU8DIKlh5XSNkzzBoSQmV/C5jvWWKYoUqh4YdNpMvJL+PK59hyd35dPRrVm9f5bZOaXkG9iNlKwe7p/mPUMpX4/RreGrmQXluBpL+Orce0JdrMlr0jBjvNxvLP7KkXlvMjc7qQoZOTfvUsqrx9DrVaTn59fJzO+9XtKy+snBU2LwGMtvWnj50hDd1sSsgro/tEBo3OaU0+pwMNN+/bt2b59OwBvvvkmH3zwAVFRUbU8qgdPWdZKz44exc2zR5m69G3efOLN2h7mfUUQLD1c6NswBbrIebaTP8t2XcVDz8pJJhUjlYjwdbQmp0hBVoFmEujRVYdp5G6Lg7UFt5JzNW0LQ5txMiKt3N8jULOYbUFZuh8jyNUGqVjE1+M7sO1MDB/tvUGXBs688EgQ9tZSZv50weR5LCQiJnYLIjo9n4uxhjmvpeO3CgsL+eGHH/j444+Ji4sjLS0NS0tLU6etNbQ9pT0aufLN+A5cjc9mzf7b5BUrCHCW6/pJQTOr+1grby7HZZGUbRxJpkXw+BKoi7z//vv873//0wlxKmOHZY5orZXUajWJ186gLilk4cKFRERE4OjoyIcffmiWYiUQBEsPE/p2T572VkjEIpY+0dxI2Q1wZH5fvj0awbJdV3Xb9FcXe4e4IRGLOFrKgkiwe7q/mO2nael+DLmlxsD2hxNRLP1T8yLceyURS4mYsZ0D+OSfm0Sm5RudZ+kTLWjsYcfzm04Z9SNp+zFcJYWsW7eONWvWGFiWSCQSHhTFxcVMnTqVQYMGMWrUKJNfENqe0sr0kwJ8tPcGb/ymKUA3TOhAiIfpviFz6CkVME/mL/+U1f87T68VByq0w2pUxuvbHFi/fj3Lly/XxaSqVCq+/vprLCwsePfdd+vcjW9NImTBPxzo2z3dSMphyvdnjI6ZOyAEG5mEZbuuGiRA6SOTipk7IISk7EJ2XjS0ExLsnu4vZvvMlu6TKCzR/Fz6BfbHhXjGdg6gnb+TUUE5pUcDxnTy5+O/b3DwRgqm6DdgIElXTxptl0gkLFq0CGdnZ5ydnXF1dcXNzQ13d3c8PT1rfDk8MjKSjRs3snHjRj7++GNWr15Nly5dDI7R9pSa6ictVCiNCstkE+kQZSF4fAnUJe7aYeUjcWiCMt34y6e0HVaPhq5mJ07RkpiYSGyscUKOp6enWReTWgTB0sOB1u4pI7+Ev68mGe2f2C0IsDTY9/mzbUnOKeJWUg62VhY83d4Xf2c5L2w+rfMTBcHu6UFgtgVl6T6JpJxCQjztSM01LJLS8jQ/O1hbGGwf2c6XNwY14YcTUXx+4HaZvyc3O9PkdqVSyfvvv1/uGEUiEWKxGKlUilQqxdLSEplMhpWVFXK5HLlcjo2NDXZ2dtjb2+Po6Iijo6OuSHVxccHd3R13d3dSUu4WvOfOnaNr1648/fTTfPjhhwQGBgJ3e0rvpZ+0LASPL4G6QnUjVo+Fp9H/00MsfaI5z5jZbNSCBQv48MMPKSw0bF2JiYnhjz/+4Mknn6ylkT04KpMFr1arcbZU8mSHhjzXxV9YcXnA6OfTV5bQuCxGtfdjzB1v0dOR6by67QJXE7INjhPsnu4/ZltQlo7fuhyXRc9GbnjYWxF+x7sK7ma3punZEgxo6sEHT7Vkz5VEFu28XObvEAGJt0LZu3snc+bMISYmRhdH6O3tzb59+0hOTiYlJYW0tDTS09PJyMggMzOTrKwssrOzyc3NJTc3l/z8fAoLCyksLCQjI4Pk5GRKSkpQKpWoVFUr8JRKzV3Z9u3b2b59Ow0aNKDfwCFEOwwCqt9PWhGle0oFBB4092KHpbyzHGqOdljJyclGxSSAi4sLBQUFtTCi2qMswdKunb+zeM400iwleK1cyY/rk5g5cyaOjo61PeR6g77dk6kbwWe+PmG07cvD4Xx5OLzc8wp2Tw8Gs/3mLx2/tftSAtN6N2R0Rz+Oh99Vfj3T0Y8SpYoTd7Z1CnRmzbNtORWZzqxtF8rsLwRNP4atlQUjRozgscceY+3atSxevJjc3Fzs7e1p2rQpTZs2rZHrUalUZGRkkJSURHJyMqmpqaSlpZGWlkZGRgahoaHs3bvX6HEikQiRSERkWh7qO9Zb1e0nrQjB40ugNhEiVsvGxsaG0aNHk5mZqfucaN68OZcvl33DXB+wkUmRZCew6v33+eOPP1CXFJJXAlOnTgVgyJAhdOjQoZZHWb94b3hL+n1yEKVajZG3XzUR7J4eDGZbUIJh/NaVhGy2nY5hdEc/pGIRJyLS6RLkzGOtvFl74DbJOUX4OFrzzfgOqNXw1+VEhrT0Mjjf9cRsridq0jZK92PIZDLmzJnDhAkTWL58OR4eHjV6LWKxGBcXF1xcXGjWrJnR/u3bt7N3714kEglKpZLg4GDmzZvH+PHjkcvlnI/OYPgXx4Dq9ZNWFsHjS6A20NphdQly5qcpXU0eM3zdUc7HZAKaL5jpfRoyop0vHvYykrKL2H4mhi8OhelmRszJDsvJyYmffvoJgB49enDkyJEau9l92Dl79izfffed0XaZTEabNm0e/IDqMbGxsby9aBFJFxNxGjijxs4r2D09GMy6oCzdj/HW76HEZxUwqr0vjzbzJC6zgGW7rvDtUc0xfk7W2N/ppXz3yRZG51u176auoCyrH8PFxYVPPvmk5i+mAqysNEv3PXv2ZN68eQwaNAix+G4fqX5PaVX7SauC4PElUBvoR6wCbDwaYWTzFZl2t9Vl1eg2DGnhxfazMYTGZtHWX5Ou4e1orYtVNVc7rJ9++glfX19atevIlfisemejVJoxY8awfv16jhw5YrC9pKSEK1eu0Lp16zIeKVAT3L59m99++43t27dz9qwm5lIkErHw3Y9Y+9+9h2YIdk8PDrP+9Cjdj6FQqfns31t89u8tk8efiEgn8M3dFZ63LvZjPPbYYyQnJ+Pm5mZyv35PaVX6SauC4PElUBvoR6xqORWZzv8uJ5o8vpWvA4+18uazf2/x6T7NEvmWU9Gk55XwYvcgvjseyfXEHLO0w7qVlMOWs5kEvrKZDdnObFhzt4iqTzZK+ohEInr16mVUUKpUKsaNG8elS5dqaWTmTXJyMv379yc0NBSxWGygFXjhhRd4bUhL/NwcBLunhwizn06qL/FbYrG4zGIS7vaUgqafFGB0Rz+DY0r3k1YVweNLoDbQj1jVx8ZSYnJ7x0BnAP68ZNjy8eeleMRiEY+18tZte5gjVvWJSc9n3IaTDFh1mO9PRqG2cYFSoYz6NkoDVh1m3IaTxJiwWzJH/vvvP6NtPXr0YNKkSbUwmvqBpaUlqampiEQiI+HplClTAI3d077ZvXikgQuAyfezPtr9jzRwYd/sXkIx+YAx+29/IX7rLtqe0sr0kwI08bSjf1NNL2igsw12VhbM6NMQgGsJ2fx7PVl3bsHjq/5RV5Jn9CNWtawY2RpbmRSFUsXpyAze+981QuM0S+AyieY+urBEafCYgjs/t/Sx120zBzsswUapYmbOnMngwYOJiIjgq6++wtbWlsOHD9f2sMwaR0dHDh8+TNu2bcnNvZty4+vrS6dOnXQ/V8buSYRmQqNPY3fB7qkWMfuCEoT4LS36PaUV9ZMCtPB2YN6jIQbn0P78y9kYg4JS8PiqH+g+1G8k14nkmdIRq8VKNX+FJnDgRjIZ+cU0crdjco8G/PxSV0Z8cYwrCdmE3Wnz6BDgTGxGnO6xne7MXHroxY+CaTusnJwcfvvtN/bv38+HH36Ip6fn/bzMaiPYKFWOESNGABofyu3bt+Pm5Sv0lz4AfvvtN3Jzc3WezADjxo0zmfRWlt2T8PepO4jU6vKMccwL/Tv1+tqPMW7DyTI9vqqLtqfU3MQLAne5mzxT+ZSRB5E8cyU+i6FrjpR7TICLnD0ze3IqMo0JG08jk4r5d04vZFIxC/+4wuW4LNr4OfLOky2ws5ISl1lA748PGpxj9yvdCXG34Z9//uG7775jx44dFBVpZvIPHjxIr1697tclVpufTkfX6MrMh0+1fOg//8pDe7P0y/Fr5KqtDCxr6mt/6f1k+fLlLFy4EDc3N/7880+GDBlCeno6Fy9epFWrVrU9PIFqUK8KSqjaF6NYBCo1ZhXJFpOeT/9PD1UrDacsZFIx+2b3MovnR8CYe70Ru9cl019//ZW///6bnj170qtXL3x9fXX79O2wymP1M20Y2NyTpm/vQaWGRu62rB3TjsZ3CoOiEiXv77nO9N4NSckpZEipIlW99yPiQ4+hUCgQiUTof2yGh4cTFBRU7eu7H2jf5239HCtloyQSwZiO/ozt7E+Aiw35xUquxGexev9tzkVnAOb7Pq+rN0vmxM2bN7G2tsbPT9O3v3jxYpYtW4aHhwc3b97E3t6ea9eu8e+//zJ9+nSTM5QCdZ96V1Bqqagfg7xUbLOj2PHRbLPrxxBmLgQqy70smeoz79HG5S6ZqtXqMr9EpkyZwtdff6372d/fn/79++Pv74/IyY9vEyr2fH1jUBOm9gqmxZK95BYpdNsbudviYG3BreRcCkuUXF06iP9dTmDG1vMGj0/f8ho5MddMnlsmk2FnZ4erqyu+vr4EBwfTtGlT2rRpQ/v27bG1ta1wfFUhOzub9PR0XaSqKbQrER0DnPhpSleTNkqHbiaTkV8CwFtDmjK5RwN+Ox/L6Yh07K0tGNPJH29Ha0auP8bF2CyzXImo7Zul+oBarcbf35+8vDyOHDnCd999x4cffoiXlxc3b96s8feHQO1Rb5sOKurHaNeqOZdv3uR4vyAajhtX28OtUYSeUoHK8KCSZ3744QdmzpzJnj17DJrxtXTt2tWgoIyOjubbb78FQGRhhf+cnytM1PB3llNYoiSvWGGw/VbyXTFA7xA3JGIRR0tZEImA+JsX+fG7jcyaNYuioiKdKtXS0pKQkBCSk5OJiorixo0b7Nu3z+DxYrEYa2trnJyc8PDwwN/fn0aNGtGyZUvat29PSEiIgWdsRbzzzjt88sknzJs3j6VLl+o8aHXXVEUbJYlYxHOdA9gdmsCc7Rd123eHJnDk9b4Ma+PDxdgss7NREvpLHwwnTpwgNjYWsVhM+/btKSwsxNfXlxs3biCXCzO85kS9LSj1sZFJjeICtfmtzz//PM7OzgwdOrQWRnb/mNGnEa62snrfUypgGm3yDEBzb3tm9WtMx0AnZFIJ0en5bD0dzaZjkbrj2/k78ebgJrTwdiC3qIRdoQms2HuD/OK7SurSyTNKpZL58+ezcuVKAP766y9dQXnx4kV+/PFH9u/fz7VrpmcGPT09+eWXX1hwrFgXsepsY0l6KR/VpnfcCg7dTC4zSlUmFTN3QAhJ2YVGCVLaiNUpU6YwZMgQJk+ezJ49ewBo1aoVp0+fNjg+NTWV06dPc+nSJa5fv05ERATx8fGkpqZy6dIlnXmzPhYWFtja2uLq6oq3tzdBQUGEhITQunVrOnbsiKurq+7YGzduoFKp+Pjjj/n111/ZvHkz3bp10+3X2iiVfk/bWEooVKiMtkvFIqwtJcZBB7nFKFVqAzW81kZpyRMPr+odhJjOB8mPP/6IVCpFoVBQWFiIWCxmz549QjFphtTbJe+KaNCgAREREYDmw3737t0MGDCglkdV81Slf0itUiISS4T+oXqAdsn0kWAXvhnfgavx2ey6lEBesYIAZzkikYgP9lwHoJmXPb+9/Ai3k3PZeioaTwcrpvRowPHwNJ7fdLfY0l8yzczM5Omnn2bfvn26fkQ3NzfkcjlxcXEoFJqZRIlEgpeXF4mJibptAOPHj+fLL7/EysqKJTuv6CJWf3yxM4UlKs5GZZCWV0Qjd1ue7eSPQqlm+BfHCEvRzEh+/mxbknOKuJWUg62VBU+398XfWc4Lm09zLCzNYMzjOgcYFFBqtZotW7YwY8YMRowYwYYNG6r03KpUKq5fv87Zs2e5fPkyt27dIjo6mqSkJDIyMigoKDDy5ROJRFhZWeHg4EBGRoZOEKTt55w2bRoffvghtra29FpxQFdga6Moc4sUZdooAex4+REae9ix4PdQ3ZL3K30b0bWBC0+uPUJMRoHu2AAXOYfm9anSNdclqtJf6utozZH5fcs819ZT0by5I9Rs+0tNURWFtVKpxMPDg7S0u+8psViMp6cnJ06c0PVUCpgHQkFpgpKSEqytrVEq796Zi0QievbsycGDB2tvYPeRynh8Xd//K+mn/mDCsIGsX78eqVSY4DZHbiXlMGDVYWxlUg7M7cXZqExe/vFsmbN7G5/vSDMve/p9ckjXnzi6gx8fjmjFuG9P8t8tw+XXZZ0tePWF0WRmZhqdy8bGhsaNG9O7d2+effZZOnbsCMDgwYPZs2cPIpGITz75hFdffVXXc6kdL8DzjwQyrI03AS422MqkpOcVczQslc/+vUWUXj79Sz0bMKq9H75O1hSWKDkdmc6n+25xNSHbaEz7Zvc0ucSbn5+PSCTC2tq64ie1iuTm5nLu3DnOnz/PtWvXCAsLIy4ujtTUVFJSUkw+RiQS8UivvsR2ma3b1s7fiRe7BxnZKMktJTobJdAUiZ8/246WPndXaqLS8nhh02mDNC3QfB5cXjJQV0QUFhaydetWVq1aRbt27di4cWMNPxs1S1X6S60tJAxsbmwJ1auxG8Pb+jBty1n+upxolv2l+lTXLuzff/+lf//+BufSpuL89ttvDB8+/MFcgMADQSgoTbB3714GDRpktF0sFpOcnIyLi0stjOrBUdYdaOPGjbl1SxNb2bdvX3755RecnJxqebQCNY12xu+ZDn4sH96Sfp8cIiwlF2sLCYUKpUFhaSuTcn7RADYcidDNWAJYSEScX/Qouy7FGwrAVEqyz+0mY99XJn93aGgoLVq0MNq+du1aFi5cyLZt23j00UeN9tcXO6y8vDwDEYP2y9nGxoYGDRoQ3KEX5z2MP7v0KW2jBOBqa8mbg5uSW6Tg2O1U3OxkTO0VTGGJilFfHtOJd7TsfqU7jupc1q1bx7p163Q3Bz179uTQoUM1e9FVRKlUIpFITO7Tv/nQzt6+vOVsmf2lZfHDpM608nWg4/J9Bo4ZZd18PKzcqwK+UaNG3L59W3dM165defrppxk+fDgBAQEP4hIEHiBmH71YHRYuXGhye8uWLbGzM58Pi7LQ9pS29XeiubeDyeWMQ4cO0aFDB12BKWA+aJNnujV0JbuwBE97Gf/O6cW1ZYO4vHgg7z7ZAplU89ER4mmHhURssHwKUKJUczU+26g3GbEEnw4DmDp1KgMGDNDN7mlnG48dM20BNG3aNFJTU00Wk1B/IlZjY2N1/+/o6MjLL7/MyZMnycnJ4dKlS7y9ZFmF54hKy+efa4l0aeCCWHSnL3JSZ3IKFSzeeYW9V5P44WQ0z204ib+znJd6Bhudo2//R/H19eW9994zmGnOy8tj3759XLlyhexs49ne+83FixeRyWRMmTKF5ORko/1Vjek0hZudjK4NXNh7OdGgmDSXmE4tP52Opv+nhzh2J4q3qglLU1d8x+3bt7Gzs2PdunUkJiZy7NgxZs2aJRSTZoqwZmmCESNGcObMGaPtEyZMwNLSshZGVDfQj8dSKpVERkbSqlUrfv/9dwYOHFiLIxOoKfSTZ4JcbZCKRXw9vgPbzsTw0d4bdGngzAuPBGFvLWXmTxdwt5MBkJxTaHSu5JxCXfqMwe/Amo9XrcFGpmnUP3/+PAcPHuTEiRM0b25a7CESicqcdYL6E7EaFBTEggUL6Nq1KwMHDsTCwsJgv6W0cnME8ZmFyKQS5JZSWvo40MTTnnd3G4qfItPyCUvJpX2A8SpERprpZfezZ88a9Zpr/3YWFhbIZDKsrKyQy+XY2Nhgb2+Pg4MDjo6OODs74+rqipubG56ennh5eeHt7Y23t7fRdZbF7du3USqVbNiwgR9//JGlS5fyyiuv6D63qxrTaYonWnkjEYv4/UKcwXZziOnUUhMK+D3pLjz+xlr+eO9lwVeyniAUlCZ47bXX6N69O8OGDSM9PV0nGmjatGktj6x20S8oQSMuKCwsZOfOnUJBaSZEpeXp+qPklpqC44cTUSz98yoAe68kYikRM7ZzAJ/8cxMrC02RV2zCKL9IodLt10cNRKbl0dzbAalUSseOHXW9kveCvh1Web6WlaGu2mFZWlqyfPnyMvcHutggAipa+Ne3UXK7c1NgaoZOesfRQR8RcOvcMd5/ZwlfffUVIpEIlUqFRCKhb9++DBkyhOTkZNLS0khPTyczM5Ps7GxycnLIz88nPz+f1NRU4uPjKSkpQaVSUZnOK7FYjIWFha4wtba2xsbGBltbW+zt7XF0dNT1l6pUKvLy8pg3bx6ffPIJH374IU+MeLrKMZ2meLKNN0nZhbqZO31MxXSCZuZ0x44dTJs2DXd39wqvtTapSQX8JQLYfiamTr6XBGoeoaA0gUQioXv37hw6dIhu3bqRlaW5W23SpEktj6z2UKvV5OXlmdwXEhJicrvAw4d+YVhYovn/0jY6f1yIZ2znANr5O1Fwx1LG1MyYTCo2sJwp6/fUJE1V0WTs/RzHflOQWMrqnR2WjUyKv7O8SjZK4XeU74+38uLQzbszj8297WngZsvWU4bLuP4ucgJ8PFm/fj3Tpk1j5syZHDp0CKVSSefOnZk1a1aVx61SqUhKSiI2NpbExESSkpJITk4mNTWVtLQ0MjMzdYVpXl4eeXl55Ofnk5GRQUlJCQqFwkgZryU+Pp5x48ZhOW8xXi+s1m0/F53BtB8zdD/vu5bMX5cT2DOzJ68PCtH1l+oT5GpDK19HvjkSblKkpn+zVFhYyM8//8yaNWt01lItWrRg5MiRVX5+HhRauzBtf6kp9BOWQNMvPblHA0a09cXXyZrsQgWhcVks2BFKYnahkV2YgPkiFJTl0Lx5cw4dOkTbtm11bv/1GQsLC51diT71oa+0vqBfGCblFBLiaWfsT5in+dnB2kJXuLjbGZpra7cl5Ri/Xkr/npogJiaG1157jW3btgHwWIdGiDuPrZKY4JEGLmZhh9UnxF1no/T5s21N2igVlij5YM8NAC7HZ3P4Vgoj2/thK7Pgv1spuNvLmNA1kMISJd8ejdCdWyIW0afx3Rm2Vq1aceDAAXbu3MnSpUtNGtNXBrFYjJeXF15eXvd07YsWLeKDDz4wsJiSSqU0bdqUnk+NZ5fpl6MObX/pwOaeuuhdfYa18Qbg9/NxJh6tYdsvv3Fmz88cPnyYvLw8g5lyZ2fjFpAHhUqlIiMjo1xR6YIdoSj0LtqUAj4y7e7EglQs4tsJHWkf4MRPp2O4lpCNg7UFbfwcsbOSkpgNCpWaBTtC65S4TeD+IBSUFdC6dWvefPNN3nvvPSIjI/Hw8a+0B5c5IRKJOH/+PIMHDyY2NtbAUsne3r4WRyZQk+gvmV6Oy6JnIzc87K0MrGO0xWNaXjE3E3MoUapo6ePA7tAE3TEWEhHNvO3ZfSmB0oju/J6aID8/nxUrVvD+/9s77/CmyvaPfzK6994thULZlLL3niIbRBFFWSrwunDrK/xeFQUHilt5RUWG+gIylI3svWdpge6990iT3x8hIWnS0oVtk+dzXVzCeU5OnhPPSe5zP/f9/S5dSlnZ3U7kGRNHM3Jkj2rJYQ1q5cmjPQNNpjt3eo9AVh+LBmDX1RTGh/kyu1+wVkZpx5VkAxmlOT+dZm7/5jzY0ZcBrTwoK1dyMjqTj3ff0Pt/X65U8WhP/QdriUTCuHHjGDdu3D9yflVRWFioDSaDgoJ4/vnnmTlzJk5OTlxJzGFbBY92Y+jWl+radAKM7eTHzdR8LidW3nD0/rv/oSz1bhCuu5w/duxYHBwccHBwwNnZGTc3Nzw9PfH29sbf35+AgACCg4Np0aJFvVsSbty4kalTpzJnzhzee+89g8Cypg5LALP6BtMj2I0p3xw1CDw1mJrDkqByTD8Sqgemzv4X6yIUPPxLBKmF16qtwWVqtGnThjNnzjBhwgQOHTqk3S4ylKaD7pLp9otJPDMwhIe6BXBMp15sWrcAysqVHL+VQV6JgiNR6Uzo7MfKfZEU3HHGmdDZH3srOX9eNgwoA91s6+UhLCkpiS5dupCSkmKw3KnpIr2XxaopPgy29HKgX4g7R29lsPpotJ6jUWWUKJSs3BfFyn1Rle6jkVFqzEFBr169GDNmDPPmzWP06NF6lpa1qS/VJSzAmWB3Oz7aHVHpayXAzt/XsOSt1zlw4IBWeF6Dq6srxcXFJCYmEh0djUKhqLJ+VCaTaRuZ7O3tcXJywsXFBXd3d7y8vPD19SUgIIDAwECaN29OQEBApTaeN2/eBGDVqlVs2LCBDz74gNmzZ2ub3WrqsCSRwBO9g9l1NVnr9W4hk2hLZfTOw0QclgRVY3rfpvWIngZX6ABSCg1vFBUQk1nIzydiWH0s2uRdZNzc3Ni7dy/z58/X+itbWVk18KwE9YlmyfRKUi4bTsXxULcA5FIJx29n0jPYlTEdfflifxSpd5azl++KYONTvdkwt5fWKWdOv+YcvJGmV5MHhkumtUWlUrF9+3bs7e1JTjbMoBgrTzFmsWqqvDehA0M/OVCvupyNUUapIpMnT660RrE29aW6jOukXu7+47x+TbEugW62DOrXm0F//83JkyeZN28e58+f145HREQYCOGXlJRw+/Ztbt++TWxsLPHx8SQlJZGSkkJmZiZZWVnk5uaSm5tLamoqpaWlldaLgjpjrGlcsrOzw8HBAScnJ9LT05FIJJSXl5OTk8NTTz3Fxx9/zJdffsmQIUNq3AHf0tMebydrriXl8d6EDkwK98NKLuNaUi7/t+2q3kOoKXXACypHCJtXwvpTsXXyuV4yth3Tmmhhf3VQqVQ89thjrFmzhi+++IJnnnkGqJktl6Bxoiv+LJdKmD8ohCld/PF0sCYhu4ifj0fz3yPReq/pGuTCqyNb097PifwSBdsvJbFsx3VtxlKX+hB/vnz5Mh06dMDJyYm2bdty7Ngx7ZiLiwuZmZl1Or4psP5UbL3KKH0wsUOTbVbSUBubTgCpBE68NoS4rCImfmVcK9WYTWd5eTn//e9/eemll1CpVNoGz7qiUqlIT0/n5s2bxMTEEBsbS2JiIsnJyaSlpZGZmUlOTg55eXkUFRVRUlKiVxJSEWt7J7zmr1GnHamew9KItl58M6MrmQWlZBeV8uV+dQb0mUEt8HO2YdwXR7ienKd9j4oOSwLTQwSURqiLBpcui4a3YsGglvUwo8ZLnz59cA5qTbdpL9TYlkvQeGnszjNbt25l7NixettatmxJZGQknTp10ssKmTP19V320vBQ5g8KqYcZNSy1sekE6N/SnZ+e7MHbW67w4536VGNU9rCUmZlJSkpKg0rPjR8/nj/++AO467Bka2tL+/bt6TPmITYWVq3WUdFhaUJnPz6ZGkaJopyBH/5NUo5ai9bXyZq/Fw1i+6Uknv/1vN4xti/sazarBOaIeFSoQH1qcH246wYe9lZN/qm+MuIyC/F5+F1OJxRw/c5Tf0XMrSTAVGjsS6YxMTF69WkSiYSUlBRmzpxpIKxtziwY1BJ3eyve2nQRhQpUVF+b0xRklCpSm/pSgIOR6TR7bXul4/eqL3V1dW3QDm+AlJQU7d8HDhzIggULePDBB5HL5ZyLzWJjJZlXDRU74DWSYGdisrTBJEBiTjGnYzKNCuLfL7kwQeNABJQ6aDS4NLTzdeS5Ia3o1swFK7mM2MxC1p2K1X4JaZYDJ4X74+VoRUpuCb+ejuOrAze1P8SmqsGlWxIANbflMvWSgKZOY3eeiYmJQSqVatUGVCoVubm5JCUl8cgjj9TLe5gKPdzLSVm9kFbT3yZd7mF2MkoVaewPS/eLRx99lD59+jBv3jxattRfOauNw1JKrrqGuqKsGEBGfqnRTGR9y4UJGhcioNRBV4OrX0t3vn+sK1cTc1m5L4qCUgVBrrZ4O97V21vxUBij2/vw65k4LsXn0DnQmUXDQ/F1tuH1TeofYlPU4KoPW65XN14iPb/E5EsCmjK6zjN1pb6dZ27fvq0NJqVSKZaWlrz11lu88MIL9fYepsCRI0cYPHgwpaWlrJ/XF5WDl9nJKFWksT8s3S/mz59f6VhtOuAjknMpVSjxcjSiQetopdWr1VCfcmGCxokIKO+gq8FlbyXn4ymd2H89jafXnjHqiNDR34kxHX35dG8kn+xR/+D+cjKWzIIyZvcN5qdj0VxPzjM5DS5REmBeaJZM69KgVtMl0+o0du3evVv79+nTp/P+++/j6+tb7fcwdcrKyli8eDFLly7VlgUEBQVhYWFhdjJKxmjMD0sNQW064AtKy/k7IpXBrT1p4WHHzTS1XmkLD3u6BLqw1ojDkrlcX+aK+L97B10NrnGdfPFwsGb5rghUKrCxkFGsKNcLLLs1U9fDbL2oLyGx9WIic/s3Z0xHX64nq/XKTEWDq6YlARIJPNItkOk9Aglys6OwtJwriTl8ti+Ks7FqyzNTLQkwJaZ1C6RPC/e7Elr3YclUK0BejcYucpPJzc3F1taW/fv319qdxVSJiIhg2rRpXLhwQa/GVC7X/7o3JxklY+g9LJUrKa/BCrgp1pfW1GEJYNmuCHqHuLN2dk/t9/7M3s3ILirji7/vaprWl1yYoHEjAso76Gpw9QlxJ7e4DG9HK76d0YUWHvYUlCjYdC6B/2y/SolCiZVMXQtS0atY423cwe+ue0xlGlyZmZl88803bNu2jc2bN+Ph4XE/T7HO1LQk4PVRbZjTrzkbz8Xz8/EYHG0seKR7IBvm9mTy12pnBVMsCTBFAlxt+XlW/TvP6Gm9VhKoVmzsci1JoXmHblw8th87O7GEpsuGDRuYPn06KpVKTzDbyspKzwJQoGZat0B6NnNh0Cvfgldrs64vrY3DUlRqPg99e4xXR7ZmwaAQlCoVx25m8N5f17Q1lmDcYUlgeoiAEsgvURCbefcmCXa3Qy6V8N1jXdlwOo5lOyPo2dyVJ3oH42gj51/rz3Pzjh1Z1yBX4rPu+rp2v5O5rFhXEptRSEGJAjsrOTdv3uSTTz5h1apVFBeru+Pi4uIaNKA8efIkpaWl9O3b1+h4TUsCZFIJj/YIYvulJF749YJ2+/ZLSRx+eTDjw/y4EJ9jciUBpk59Os/UtrErx9oL2djFbL2awbRuIqDU5fDhw3q2qBosLS0bYDaNn+LiYh4c3Jvoy5fZsOMgV0tczba+tLYd8FcSc5nx35OVjjcFhyVB/SACSiAmo0Dvy8PWUt3FtuZ4DEu2XgVg55VkLGVSpvcI4uPdN/g7IpX4rELeGN2aorJyLifkEBagbsopK1dibSHTew8V8MLbSzmw+RciIiK0OmAaCgsLKSsrw8LC4h84Y0OeeeYZzpw5w+jRo1m+fDlt27bVG69pSYBcKsHGUmbQAZiRX0q5UqWX2TWVkgBzoy5LpnVq7FJBeblo7DKGhYUFMpnMIKgUblaGREVFMX78eK5cUZfxDO/RganOzmZdX2quHfCC+sH075BqUFEbS+NFuuWCfn3kH+cTmd4jiPBAFzaeS+CJ1af44pFwvnm0CwAlZeUs3XGd+QNDKCzR94EFWP3TGkqT1D+iFa2z+vXrp/27RCJBKpUik8mQy+XI5XIsLS2xtLTE2toaa2trbGxssLW1xc7ODnt7e+zt7XF0dMTR0RFnZ2ftHzc3N9zd3XF1dcXd3b3STEV2djYAO3fu5K+//mLOnDksWbIEb29voOYlASUKJedis5gc7s/Z2CxO3c7E0caChYNbklNUplewLWy5zAvR2HX/KC4uNrq0XZVLijny+++/8/jjj1NUVKTdplsiYK71pebaAS+oH0RAiaE2VkpeMaHeDobZtTsyCE426ixiZGo+w1ccpKWnPU42FkSm5lNcVs5bD7TlxO0MKrJty2bWf/UhP/30E0qlUi+onD17NmVlZeTn55Ofn09BQQGFhYUUFRVRXFxMSUkJJSUl5OfnU1ZWhkKh0B6jpmZHugGrTCbDwsKCvDy1RZYms/Htt9/y/fff06lTJx6dOYvYzGba11enJADguV/P8/nD4Xz6UGfta2MyCpj89VHisu5+kYN+SYDAdKlpYxeAhUzCnH7NmdTZH38XG3KLFVxKyOH1TZdIzi0WjV06FBcX62UnZTIZbm5u/PDDDw04q8ZDeXk5fn5+pKSk6AnjAzX+HjVVRAe8oLaIX28MNbguJ+TQv6UHXo7W3LpTKwng6aCui8yoIKcQmXrX83VgqFo4+MidekMNEqB3h5YMW7WKxYsX8+abb/Lzzz8D6i+yzz//vE7LUiUlJaSnp5ORkUF6ejpZWVnaPzk5OeTm5pKbm1tpwKoJKHVRKpWcO3eOG2krcX/0I+326pQERN8JEG+k5HE2NoujUel4OFjx1IAWfDujK1O+OUpW4d2siQqIzigwyApoAmaZTL+EQNA0qWljl1wq4b+Pd6NLkAvrT8VxLSkXJxsLwgKccbCWk5xrmlqvtaWgoEAvMJo4cSLffPMNLi6GriXmSHR0tNYxpmIAKQLKu+h2wJeUloG0+t+/ptgBL6geIqDEUINr+8UknhkYwkPdAjh2626mcVq3AMrKlRy/ZZh9BLCSS3lxWCgpucUGy+W6GlwBAQH8+OOPPP/887zwwgtERETUuWjeysoKPz8//Pz8avV6a2trSkpKtPVXbdu25ZVXXmHatGlcSS5ggo4tV3VKAuKyilgzqwfHb2WyeOvdjNThqHR2PTeAef1b8P6O63qv15QeZGZmsmvXLnbs2MG2bdvw9fXl4sWLtTqvxoS51mVpqGljF8CsvsH0CHZjyjdqVQBjmFtjV1XX0fHjxwH198GqVat45JFHRHe3Di1atMDGxkZvqVtDUlISbm5uDTCrxslDXQP4YemrnLdsg01wuFl3wAuqh/n8mt0DXQ2uK0m5bDgVx0PdApBLJRy/nUnPYFfGdPTli/1RpOapl74/f7gzqXklRKbkYW9twdQu/gS62vLEj6coKNVvOjGmwRUWFsa+ffv+sXOsDJVKhUKhrvkcPHgwL7/8MkOGDNH+EFnK9b98q1MS0L2ZK629HXln+zW9faIzCrmZlm/U53XurCfJiblCVFQUKpUKuVyOQqEgODi43s71n6Ym+ootvUw7GKppY5dEAk/0DmbX1WQuxOcgk0qwkEm0DzS6mHpjV3Wuo74tXEgvs8DGxoZr164RFBTUUNNt1FS22hEXF0f79u3/4dk0TgoKCpg9eza7Nq0H4EZyrtk7LAnujQgo76CrwQXwxuZLJOYUMaWLP8PbepOQXcT/bbvCf4/c3edSQg5TugTwyB3B11PRmTy74TxXk3L1jt3YNbgkEgmbN28mODiYdu0Mf5BrUxLg4aBevpdJDbMj8jtLIrqoVCrOHNiBqqxYu02hUCCRSLC1tSU5OVnbINQUqI2+Yr8Qd5N+sq9pY1dLT3u8nay5lpTHexM6MCncDyu5jGtJufzftqt6qwem2thVk+soLrMAj8c/pYufLVKHxq1p21iQyWS4uLgwZ84cRo0a1dDTaRRcv36dcePGERkZCYBcLq9XuTCB6SJRicIRLTNWneDorYx6lUzQaHA19fquAcv3a0sC2vk4sv1f/dh8PoHnNpzX7vPpQ2GM7uBDnw/24elgxbaF/fj9TByLfr+7XN3O15Et8/uy7mQsb/5xWbs9yM2WCfILvPTSS5SXlxutZ7KwsMDb25s2bdrQp08fxo0bR6dOne7fSdcSXX3F2lgVLhnbjmlNsPZo7969nDt3jmnTpuHv7683ll+ioMPindqHkr/+1Y8gN3XgvOF0HMdvZWobu7ZcSOBf688zoq0X38zoSmZBKdlFpXy5/yYAzwxqgZ+zDeO+OML15Lu1vxLg8uIRBj9uMTEx7N27lylTpuDg0HSyJ+Z6Hd1vrKysKC1V18GPHDmSNWvWiKVu1A/106ZNY/PmzZSXl2ubuywsLLSfl0BQFeKxQgehwVU5NS0JSM0r4WBkGpO7BGBvZcGhyDQ8Ha14vFczisvK+e+R29pja0oCnhv7HMOHD2f8+PHcvHlT2wX/zjvvcOvWLc6cOUN0dDS7du1i165dvP3220ilUlxcXGjZsiXdu3dn5MiRDBkypMGEnOukr3gncGiq+orfffcdGzZs4OWXX2bAgAE88cQTTJw4EXt7+1ppvdreCQztrGQ8sPIESTnq7PXRm+n8vWgQ8/q34Plfz2uPqdvYlZWVxe+//86PP/7IkSNHAPD29mb06NH/xEdRZ8z5OqoPKsuiqVQqbXD0/vvv89JLLyGVSu9xNPNgx44d/PrrrwbbK0rcCQSVIQJKHYQGV+XUpiRgzk+nmdu/OQ929GVAKw/KypWcjM7k49039JbKdUsC2rZty9mzZ5k7dy7r1q1DKpXywgsvYGNjo91fqVRy6NAhtm/fzvHjx7lx4wanTp3i+PHjfPbZZwDY29sTGBhI586dGTJkCGPHjr3vWQhz11f08/PT1r0ePHiQv//+myeffBJfX1/ChowH7xHafavT2KWxMT0Tk6UNJgESc4o5HZNptA731dffJOLoTu0DiW5Dio+PT32e7n3D3K+j2lKdOtNg60Is3AJ4+anHeOWVVxpqqo2SsLAwo9s1ShuiuUtwL0RAWQGhwWUcXVuucqUKhVLFp3sj+XRvZKWvKVEoWbkvipX7oirdx5gtl729Pb/88gtDhw7l1q1besEkgFQqZcCAAQwYMEBve0REBFu2bOHgwYNcuXKFmzdvcvXqVX755RdAbT/n4+ND+/bt6devH+PGjaN169b3PPfY2Fjmzp3L4sWL6dmzp9F9dPUVq9JW9He24fArgyt9r3UnY3ltk/qBpjHqKyqVSiIiIjh79ixXrlwhMjKS2NhYUlJSSE5O1jZ3abIa5eXlxMXFUXj4IPaT7waU1Wnsir7jGVxxH1A7LhkTnt7513bKUu9mv3VLJx5++GGaNWtGSEgI7du3p0uXLnTq1KlR2RJW9zoCWD+nJz2bGz4kHbiRyuM/nNL+uzFeR/VJTepMY1HhO+crooPdicssNNnPpDbY2Rm3MVWpVFy+fJkOHZr+Spvg/iICSiPoanDVtn7JFDW4/smSAIlEwpNPPlmjY4WGhvLSSy/x0ksvabdlZmaydetW9u3bx9mzZ4mJiWH79u1s376dV199FalUiru7Oy1btqRXr16MGjWK/v37I5ffvTX++usvdu7cyd69e/nwww/517/+ZfC0rtFXvJe2YkZBqV7dqYYBrTyY0NmPQ5Fp2m1V6SumpKRw6NAhJk+eXKPPqCqUSiWxsbGcOXOGS5cuERkZSXR0NMnJyWRmZlJQUGDUcUUul2NnZ4ejoyNpaXfnL5FI8PLy4scff6TPgMG016mhrE5jV0RyLqUKJV46upTa/RyttMGn9v2AqHPH+Ncz8/jjjz8MXhMTE8ONGzfYuXOn0fm7ubnh6+tLcHAwbdq0ISwsjO7du9dbZnvfvn3Y2tpW+lAC1b+ONCRmF7FsZ4TetpTcYr1/m7JOZ0394FWo79tjtzIY+skBUWeqg7Hud4lEQpcuXYw2awoEFRFNOVVQnSdfDZpxU+/UXX8qtl5LAj6Y2OEfD7wVCgV79+5lx44dnDhxgqioKDIyMvRqhRwdHWnWrBnh4eHExsZy4MABbZH6hAkT+OGHH3ByUmfIIlPyGLbiIPZWcva/OIAzMdlVaisaY82sHnT0d6Lbu3soqWAFuuf5/toMrkqlYs2aNSxcuJCcnBwiIyMJCQmp1nskJydz+vRpLl26REREBNHR0SQmJpKRkUF+fr7RwnuZTIatrS3Ozs54enoSGBhISEgI7dq1o3PnzrRt21YbfJ88eZIePXoglUpRqVQsXLiQd999F3t7e6DmjV2peSV8+2gXBrf2ZMSnB7mZpg48W3jYs/PZfqw9Gcu/dVx3gtxsObBoEAC7d+9m5syZJCcno1QqCQkJ0XatxsfHc+rUKS5cuEBERAS3b98mKSmJrKwsCgsLDXywJRIJNjY2ODs74+3tTWBgIK1ataJjx4507dqVli1bVqsOz9/fn8TERBYsWMDSpUsNMkI1vY7Wz+mJi60lIz49eM/3Bv3ryBSoS52pLouGtzLLOtOKFBUVYWur/t2SSCS4u7vzv//9T88WWCCoCpGhrIIAV1t+ntVDW5vz54UYUgr067LMTYPLFEoC5HI5I0aMYMSIEXrbL168yNatWzl8+DBXr17l+vXrRgXVN23axN9//82aNWsYPXq0Vl+xOtqKxvBwsKJXczc2no03CCZ19RVjY2OZM2cOu3bt0o7HxsYSEhJCZmYmZ86c4eLFi1y/fp3bt2+TmJhIeno6eXl5lJSUGHTOS6VSbGxscHJyIjAwEH9/f0JCQmjTpg2dO3emQ4cOWFsbZgcrIzg4GJlMRvPmzfnxxx/p1auX3nhttF6X7Yqgd4g7a2f31C71zuzdjOyiMr74+24pRUWt12HDhnH9+nVefvllvv76a1q2vBsw+Pv74+/vz4QJE4yeR2FhIadPn+bs2bNcvXqVmzdvEh8fT3p6OpcuXeLs2bMGr7G0tMTBwQEPDw/t59i2bVvCw8Pp0qULcrmcpKQkVCoVX3zxBZs3b+bHH39k0KBB2mPU9jqSSSVYyaUUlpYb3wHT0+kUdaa1p7KGJd0MZZ8+ffj999/x8vJqwJkKmhoiQ3kPysrK2LhxI87OzsyfP59bsQl8+fPv9OjV26w1uOoqadJUSgKSkpIICAgwyFppCAoKwv2Jz0kvlvDlI+H0benO02vO8H/j2hvVVjTGrD7BvDWmLdO/P86Rm4YuTIGuNnRL3s7KlStRKBR6gaGFhYXBNlBnGKytrXF0dMTDwwM/Pz+aN29OmzZt6NSpE+Hh4drMYX1y5coVQkJCjNqIajJwGuRSCfMHhTCliz+eDtYkZBfx8/FovcYuUNcSvjqyNeGBLihVKo7dzOC9v65payw1VJaBO3XqFE5OTrRq1apezlGpVHLt2jVtacCNGze0daTZ2dkUFxcbDd6NdcuOGDGCb7/9lsDAQG0Gt7rX0fo5PQkPdEGFCiu5jLS8YtadiuOzvZHaJWBddDO4usTExODl5VWjh4eGJC6zkKGfHKBEoayWF7wGR2s5+14ciLu9FU//coa/Lidrx6zkUvY8P8BkV5aq07DUxlnJf197gvAQXw4fPqxX9iMQVAcRUN6DGzduEBoaqrfN0dGRXr168dJLLzFkyJAGmlnDYw4lAdevX6dNmzZIJBIkEglKpRIfHx86deqEn58fzh7e/I46E1cdbUVjbJnfBy9Ha3q+v9doFkqlUhH38RQ90XcN7u7udOrUieDgYFq3bk3Hjh3p0qULrq6u9fYZ1CfmovWqKS84f/48169f58KFC1y+fLnS/X0Dg7F8ZCUqqn8dfTCxI4k5RVxPzsPWUsbo9t4Ma+vNtouJLFh3zuA9dHU6y8vL2bp1Kx999BGHDx9m5cqVLFiw4D58EvWP5hrq3cJNW2e67WKSts5UIpEY2LoCvP1gW6Z2CcDOSm4QUDbGa6g+qMl3tESlRCWR0reFG0sndmwy39GCxoN4BLkHLVu2xNvbm+Tku18+ubm57Ny5kwceeMCsA0rdkoDVR26yeucpLFx9ANMpCSgvL8fZ2Znw8HDGjBnDyJEjad26tbbs4UpiDr+vPAxUT1uxYlYt2N2Ojv7OfH/4VqVLmhKJhIEPTuHGiX0kJCRopXmkUimTJk3i66+/vn8fQD1jLlqv3t7ejBkzhjFjxgCwZs0aZsyYAaD9/+fq6kp4eDgDBgxA4eDN6jtfMdW9jl7ZqF+OselcAu9N6MAj3QNZdfg25+Ky9cZVwOWYFI5u/5VPPvmEuLg47TJnY9EaPH36NK6urjRv3tzouMYPvrpe8BpaednzaI8gPtsXyYvDQg3GTdEPvsYNSxJ1HfCx25miYUlQK0RAWQ00hcq6tGnThqeffroBZtP4aOnlwPVf/kPixo1MefhR3v7wc5Ox5WrXrh1ZWVmVjpfqLGNXR1uxYkA5PswXgM3nEqqcx0effEpYgDMXLlzgp59+4scffyQzM5OUlJQanU9DY65ar+np6YBammXq1KnMmDGD/v37awO6c7FZrP7qKFC760jD94du8Uj3QPqEuBsElAD9Bw6mNOlu7aGmlOPHH3/k/PnzuLi44O7ujpubG56ennh5eeHj44OPj4/RMob65oEHHiAzM5Nnn32Wt956S9v4pqG2daZvj2nHzivJnLqdWel7m1KdqRDGFzQETfeX/h9i9erV3Lp1y2B7r169zL7GJC8vj//85z/k5OSwceNGAJLioo3qA5oqlvK73b3V0VasyNhOftxMzedyYq7BWMX3kUgkhIWFERYWxrJly9izZ4+BxWFTwBQau2rKjBkzCA0NZeDAgQa6qlD360hDYk4RAM62xveRqIzXAp89e9Zos1FFpFIpMpkMuVyOpaUl1tbW2NjYYGtri729PQ4ODjg6OuLs7Iyrqytubm64u7sbBKeVaX9mZ2ejUCj45JNPWLVqFe+99x5z5szRftdq/OCr4wWvYXR7b7oEuTD04wP4uxh+9hpMxQ9eNCwJGgrzjoiqwfbt241u/+uvv8zePSA1NZXly5frbTt8+DC9evXivffe0+tgNVWaudkh4c5yYjW0FXUJC3Am2N2Oj3br6whWRHLnfXSRy+WMHDmyPk6hQTA3rVc3NzdGjRpV6XhdriNdAu9kajPzDfeRADGXT7Piww/46KOPUCqV2gzlrl276NevH0lJSSQnJ5OSkkJqairp6elkZGSQlZVFdnY2OTk55OXlUVBQQEFBAcXFxWRlZZGSkoJCoaC8vLzay+e6wamVlRWWlpZa6SqlUkl2djbPPPMMr776Ko899hgjHxxPbKa6jjjY3Q65VMJ3j3Vlw+k4lu2M0NaZOtrItXWmVnIpr49uw6rDt4nPLqoyoASIzSikoEShXVUpLi7mt99+46uvvqJv374sW7asWufWUNREGP+ZgS0Y1saLQFdb7K3kJOYUsz8ilc/3R5Gpc42ZujC+oP4QAeU9WLduHVFRUTz++OOcOnUKFxcXOnfujIVF5VkCc6FZs2ZYWVlRUqKfSTl+/DixsbENNKt/FjsrOYGutsRkFrL9YhLPDAzhoW4BHLt1t1t7WrcAysqVHL+l38E9rpN6ufuP8/pLmxUJdLNt0mUDlTGtWyB9WrjXuLGrd3O3JtXYVR1qeh3ZW8kpVSgpLdcP3hbeWZ48oCOQryHQzRYvN2eWLl3KvHnzePnll/ntt98AcHBwwNramuDgYIKDg+t8PsXFxSQlJZGUlERKSgppaWmkpaWRmZlJZmYm2dnZ5ObmkpeXR35+PoWFhRQUFBg9Vm5uLp9//jnf/Lod3ydXAtWvM31mYAssZFI9iamq0PjBWxak8s033/D999+Tk5MDcN+tW+uDmgjjd/Bz4mpSLlsvJpJfUk6Ihz3TugcwKNST0Z8d0lqfmrIwvqB+Mb1fqXrGwsKCNm3aMGbMGE6dOsWOHTvo3r17Q0+rUfDJJ58YBJMAAQEBPPbYYw0wo4ZBo69YXW1FAKkExnT04WxsFrGZxuvhwFBf0dSoqPW6/0YqsRlGZE2acGNXdanJddQz2JXPpnVmy8VEojMKsZZLGdHOm27NXFl7IoYrFUooKl5HzZo149dff+XIkSOsX7+eTp061eu51CY4jYmJoVmzZur5ymSUl5cTHBzMwoULmTBhApGZZcz5Tb2UW506U0W5irn9WvDvLZer1OisSN/+A8m+eR6JRKKVf9LIPiUnJ+Pp6VktIfv65syZM1haWlZqgVjThqWnfzEscTgbm8XXj3ZhaBtPtl5MAkyzYUlwfxAB5T3QiMAW2Xrh0bIzbTt2bugpNRqysrK0Hau65Ofnm1U5wPQegaw+Fg3AG5svkZhTxJQu/gxv601CdhH/t+2KgbZi3xB3PBys+Xz/zSqPXa5U8WjPprGsWxdaejmweGw7FtOuUuFlU6cm11F8dhEnozMZ0dYbDwcrlCoVUan5vL7pEmtPGq4OVHYd9enThz59+tzP06o2uhnKAQMG8OKLLzJy5Eht8FZgmQOoA8rq1Jk+P6wVybnFHLuVgb+zeqnbw0HdWORmZ4m/sw0JOUUGAVdBnjojqauop1Qq+fPPP/Hx8QHUAaamhtTe3h5HR0dcXV3x8PDAy8sLPz8/AgICCA4OpkWLFvj4+NQ5CH3kkUeIjIzk6aef5p133sHFxUVvvK4GCwDxWeqHW0dr/RU4U2pYEtw/hA6lEaojAjso1JPpPQJp6WXeT2xFRUU4OTlpPZ4HDBiAk5MTmzdvNpuAEsxHX1FwfzHn66i8vJwvv/ySwYMHG/WOLihRaP3gXx4RyjMDQ3j4u+N6ZQG9mruxbk5P/rX+HI90D6Rn86qXqTsu2Ulu8d0HYgmw9+kw3n7jVdasWaPNTEqlUoYNG0bLli1JSkoiPT2dzMxMcnJyyM/Pp6ioiNLS0koNEEAdhFpYWGBjY4OdnR2Ojo64uLjg4eGBp6cnfn5++Pv7a4PQgIAAvSDUxcWF7OxsZDIZjo6OfPTRRzz++OPafWoqjK89rq0FcqmUZu62vDKiNWEBznpWpxoqE8YXCDSIgFIHcxDqvh80a9aMmJgY3njjDd55552Gnk6DoOveUV+YunuHwBBxHVWNJmiqjhd8oKstrnb63eStvBxYNDyUrw/c5GxsFvuup+q5CukGTYcPH2bevHlcvaqu0fz++++ZNWvWPeeYkZHBzZs3uX37NjExMSQkJJCUlKStIdUNQktKSqoMQiUSCZaWllhaWpKXl2cw7uvryyuvvMLg4aN48McbNRLGB/Cwt+LUG0O1/07MLuLdP6+x/VKS4Vy4K4wvEBhDXBl3qKkIrGb86K0MsxSB1V2WbNa5L2lZufzf//1fQ0+rwTBXfUVB/SKuo6qpSZ2pbs2yhtwi9UrKhfhsdl3V13CtWGfat29fLly4wFdffcXy5csJCwur1hzd3Nxwc3OrUa19bm4uUVFR3Lp1i9jYWOLj40lOTiY1NZXMzEwyMjKMBpSJiYk8++yzWHiuqHHDEkB2USnTvz+OlYWMdr6OjGznja2lzOB94G7DkjnJwglqhggoESKw1aXSUoDWD+MROo1BHx0w61IAc9RXFNQ/4jqqnNrUK1cXY3WmcrmchQsXsnDhwjrOvGocHR0JDw8nPDzc6LiuBbCmYcnLy4uJEyfy4IMPkq6y561D6kasmgjjl5WrOHJTXTKw73oqR6Iy2Ph0bzIKStl3PdVgHqX1mDkXmB5mH1AKEdh7U61SAImEmMxCfj4Rw+pj0WZbCmBu+oqC+4O4jozT0suBfiHuHL2VgUKp4tO9kXy6N7Larz9+O5NmrxlqC2vqTBtrF7NGukgikTB48GDmz5/PAw88oBV8v5KYA4fUFrB1EcY/G5tFSm4x48N8jQaUugL8AkFFzDqgjMssxFImJXrpA5Xu02PpHlJy1TeihUzCnH7NmdTZH38XG3KLFVxKyOH1TZdIzlUL7pqaCKwoBag5BvqKEiiv4mMzZX1FQe2peB1JUKGi8kY3c7mOzMUPXpewsDC++eYbhg4datTnvL6E8UFdc+tgbRh0GjNYEAh0MeuA8vVNlygqK+dgZLredokE3h3fnvisIm0wKZdK+O/j3egS5ML6U3FcS8rFycaCsABnHKzlJN+RfTMlEVhRClB7dPUVl/yyj/0RqVi6+pqlvqKg9gS42vLx2OYEtJ/G4Ln/psCpmdnqdGowxzpTCwsL5s6dW+l4TYXxbSxkqFBpl8c1jGznjbOtJRfjcwzew1QNFgT1h9leHRoRWIDTMVl6Y12DXLC1lLP5fIJ226y+wfQIdmPKN0e5YORm02AqIrCiFKBuxMfH89133xESEsJf7z5HZmYmWXmFJOSWmp2+oqD2lJaW0qtXL0pSo+lvl8Kri54wW51OXUSdqSE1aVhq6+PImlk92HYxkZtpBShVKjr6OTG+sx9xmYX8cPS23rFN3WBBUD+Y17eQDhoRWGPLJuPC/FAqVWy5Y4knkcATvYPZdTWZC/E5yKQSLGQSg6c7DU1dBFbjB/vh5I5M7hJQ6X6acoD1c3oa1Xs7cCOVx384BZheKcC9OHXqlEHXe5dO7Rk8eDBLlizB19e3gWYmaAokJyeTlZXFG2+8wc2bavF7jd2rnZVcdNoi6kwrUpOGpaScInZcTqJ3C3cmhfsjl0lIyC7ip2PRfL4/iuzCMr1jm4vBgqBumG1AuT8i1egXkFwq4YEOPpyJzSI+uwiAlp72eDtZcy0pj/cmdGBSuB9WchnXknL5v21X9ZYVQH3z7b+RymLuBpRlZWVs3LiR1atX8+qrrzJgwID7e4J1QOMHu/ZkLIej9M/NWDkAqPXLlu2M0Ns35U5dKZhWKUB1MPb/99atW9y6dYvHH39cBJSCKnnqqaf4448/9LZp9BAFdzGoM1UpUUkqbxwx5TrTmjQsZRWW8frmy9U6bmNvWBI0HswyoMwvUVTqn9y/lQeudpZ8vPvucnfwnULkWX2DyS4q5Y1N6hvxmUEtWP1EN8Z9cYTryfoaYbEZhRSUKCjOz+G7777j008/JTk5GYARI0Y0WECp0bGvzMVGtxTgbGw2Z2Oz9caNlQMA5BUrDLbpYiqlADXBwsJC6yCkYcGCBfTt27eBZiRoCqhUKiIjDQOBH3/8kWbNmvHWW281wKwaLwGutjzVWsGGV55m2DP/R75jkNnWmZpjw5Kg8WCWAWVMRgGV3W7jOvlSqlCyTccpwPZOfZKdlYwHVp4gKUedeTt6M52/Fw1iXv8WPP/reb3jqIDuQx4g4vheAycEW9uGeyqeOnUqp06dYsWKFYwbN84gsKyqFAAMywF0kUklWMmlFJYad35o6qUA1UWpVDJjxgwDj3OARYsWNcCMBE2JTZs2Gc1GlpeXc/r06QaYUeMmLi6OESNGUFZQwAj3XP71r0FmW2dqjg1LgsaD6d9hRqhMnNXWUsawtl4cjEzTqyEpLlMHSGdisrTBJEBiTjGnYzLpEuRi9HhRt6KN2mrNmzePefPmIZVKkclkWFhYYGlpibW1Nba2ttjZ2WFvb4+joyOOjo64urri6uqKm5sbnp6eeHp64uPjg6+vL66urnp+r/fi+vXrxMTEMGHCBPr3789nn31Gp06dtOOVlQKA8XIADcHudlxdMgIruYy0vGLWnYrjs72RerZmxkoBTJHExER27tyJMVfT/fv3M3PmzH9+UoImw/Dhw3niiSf44YcfDMaWLVvWADNqnLz77rt8/vnnFBQUUFCglscpLVVL4phznaloWBI0FGYZUFYmzjq8rTe2lnL+qLB0q6kVrCgUC5CRX1rpF9dz/1rAN++/RW5url5wMWzYMOzs7MjNzSU3N5f8/HwKCwspKioiPT2dxMREFAoF5eXlRoOSikgkEqRSKXK5HEtLS6ysrLTBqb29PQ4ODjg5OeHk5ER0dLT2dYcPHyYsLIwpU6awbNky3H38Ky0FAOPlAAAxGYUcu5XB9eQ8bC1ljG7vzb8Gt6S5ux0L1p3T21dTCmDK2QJ/f38iIyM5efIk06ZNA8DJyYmcnBxtg4VAUBn29vYsXbpUL6C0t7dHLpdjY2PTgDNrXMTFxWnLiDT88MMPDBo0iC5dujTQrBoHomFJ0BBIVNWJWEyMghIF7RfvNFj2Xj2zG12budL13d16Hdx2ljLOvTWcc3FZPPTtcb3XbJjbEw8HKwZ/dEBvuwS4vHgEytIi3n//fZYvX055eTlKpZKjR4/Sq1evas83NzeXhIQEkpKSSElJIS0tjfT0dDIyMsjKyiI7O1sbmBYUFFBYWEhxcTElJSWUlZWhUChQKu9tmWUf0Bq36R9WOv7pQ2GMau9D96V7DLoAK/LehA480j2QCV8e4Vxctt7Y9oV9TTZ7UHGprV9Ya1wcbLl58yYZGRm4uLjUKKMsME9UKhWWlpYoFApCQkI4fvw4bm6GSgrmSlJSEh07diQ9Pd1gzM/Pj/j4+AaYVeMjLrOQ1zZd4nBUOlIJVBVXakqdzNXlTFB3TDdNVAW6IrAaXO0s6RPizpYLiQZyQAWl5fwdkcrg1p608LDjZpp6eaWFhz1dAl1YezLW4D20IrBWDrz77rvMmTOHl19+mc2bNxMQULkUjzE0S99t2rSpxdneRaFQYGtrq20UkUqlKJVKPDw86N+/P616DWet4fczUHk5QGV8f+gWj3QPpE+Iu0FAqVtykJeXx65du/jjjz9wdnbms88+q/X5NRSVepwDDk9+h4NFOYu3XGF6j0DcRDApqAYSiQSJRIJMJuPQoUMimKzAn3/+aTSYBFi9evU/O5lGTICrLdN9M/n1laeZvvhrbhXbmG3DkuD+Y5YBJdwVgdUsBYzp6IOFTGqw3K1h2a4Ieoe4s3Z2T1YfjQZgZu9mZBeV8cXfUXr7GhOBbdasGb/++itlZWVaPbl/GqVSqRdMTpgwgeeff57evXsjkUi4kpjD2pWHjb62snKAykjMUddYOtsanmt6SjJfblvHpk2b+Pvvv7XNK6GhobU5rQajOh7nEomEbIXc7D3OBVVTMbPtKClBoVCwYsUKvL29G3p6jY4nn3wSd3d3xo8fbzDWs2fPf35CjZSkpCQmTJhAWUkJX88ZgpWVldk2LAnuP2Z7FemKwAKMD/MjLa+Ew1HGn3qjUvN56NtjvDqyNQsGhaBUqTh2M4P3/rqmp8cIVYvANlQwCSCTyRg7dixt2rRh/vz5BplSXT/YiowP8yW/RMHuaynVeq/AOwFTZr6+b6xKpWJEn3BUZcV62yUSiV5zUGNHeJwL6kpVmW0J0Pql9ST7tiQyJY+WXiJrpItEImHs2LHIZDLKy8uRSqVMnDiRoqIiLC0tG3p6Dc5rr71GXl4emzZtoqRE/fuUmppKQECAWTcsCe4vZllDqWHGqhMcvZVRr5pdGhHYpirgPWD5fr1SAFCXA5x4bQhbLiTy4m8X9MbsreSUKpSUluuXCayc1pkHO/nywMpDXEnM1W53t1IS//UcUlKMB6a2trb4+vrSunVrevbsyfDhw+nSpUujqjusi8e5LouGtzI7j3NB9TLbGkRdW9VYWFigUCjYvn07o0ePbujpNBrc3d3JyNA3pVi/fj0PPfRQA81IYA40nl/pBuC9CR2QS40LfNeWpi4COyjUE1mFz6SqcoD2vo4cfnkQbz7Qhkd7BjG7bzC/zevFg518WXsiRi+YlEkljAlvTlJSEh9//DFyuVwvUOzatSu+vr4kJSWxbds23nzzTbp3745MJtPWkE6ePJmPPvqIK1eu3L8PoQrq2+N8wynD+luB6bL+VCxDPznA0TvuWjXNbK834+uloETBlcQczsVmcSUxh9TMHCQSCVOnThXBpA5RUVHk5uYabJ82bRrLly9vgBkJzAWzzlCC+gu+PkVgP5jYoUlLLUSm5DFsxUG9bRuf7k2Aiy09lu4x6BL0d7Hh1ZGt6eTvjIeDFUqViqjUfNafijParLTn+f7aou8zZ84wadIkYmJi1O8dGUlISAigbiA6cuQIe/bs4eTJk9y4cYPk5GSKi+8ulUskEpycnAgICKBDhw706dOHUaNGERwcXKtzLywspLS0FGdnZ6PjcZmFDP3kAO+Ob18tj3NdHK3l7HtxIO72Vjz9yxn+uqyWO7GSS9nz/ACReTIDRGa75tyrLECVn8akXq15akg7URZwh379+nH4sGEtvEwmY/fu3QwaNKgBZiUwB8w+oIT6+6J/aXgo8weF1MOMGpZ/shQgNzeXp59+mmPHjhEZGYlMJqvyOMXFxezfv599+/Zx5swZIiMjSU1N1Qoag7rhyMXFhWbNmtGxY0f69evHqFGj7tncsGDBAlavXs13333Hww8/bDCu+Vw6+TsR6GqnN6brcT68QkAO8PaDbZnaRV2/pBtQNvUSCUH1EA+uNUOUBdSes2fPMmvWLM6fP6+3ffjw4ezcubNhJiUwC0RAeQfdJgtzF4HVZOJKKnEUqg33OxOXm5vL7t27OXDgAGfPntXqPup6acvlclxdXWnevDlhYWEMHDiQESNGaDOSnTt31n4JP/HEE6xcuRI7O3XgaCxzq0vXIBd+f6o3y3Ze58u/9cXLW3nZs31hPz7bF8mLw0L1AkoNuplbgWlRk8x2TlEZU7oEMKytF629HLC1khOTUcC6k7GsPRmrXSEw5cx2Xb+LRcObWjrpiSeeANQP2FKplEmTJrF+/foGnpnAlBEBpQ66T8UqZTkSaeXZMlN/KjaVjEp6ejo7duzg4MGDnD9/nujoaDIzM/UsMS0sLHB3dyc5OVnrTCSVSmnevDm///47nTp1YvGWK3oyUxX5z7j2TO8eSP/l+w1sKX+Z1YOswlLWHI9h/dxeBgGlTCphRo8gk/c4N1dqktlu5WXPjn/158jNdA5FppNfoqB/Sw9Gtvfmf2fjtU1xpprZFmUB9cOWLVsYN24cUqmUw4cP07FjR+RyOVZWVg09NYEJY7ayQRVJS0vj4/feY0C7diRc28f5AgfaDplMQk6pWYrAmoofrLu7O48++iiPPvqo3vbY2Fh27NjB4cOHuXTpErdu3dKzuVQqlURFRREWFka/fv0oHPIK5ZUkbKvyOB/d3psuQS4M/fgA/i7GbfPMxePcHIlMyePQHSmys7HZnI3N1hvvGuSCraWczXca3tLyShjx6UEiU/O1+6w9GcuySR2Z2jWAz/ZFEpNRSLlSxaGodKJS80zmO6i+G9487K1MZtWoKozpSmpUNL777rsaubIJBHVBBJR3iIqKYsWKFXrb7GUxPPfgePqNnohEZmF2IrCm7AcbGBjI3LlzmTt3LgBbt25l7Nix2nGJRKINMI+dOodvbxUSiXFFgMo8zq3kUl4f3YZVh28Tn11UaUAJ5uFxbo78ciK2yhrAcWF+KJUqtpxPBCCrsIwsI05UO68kM7VrACEe9sRkqGW9ZFIJa47HGs1sK5VKVCrVPWuSGwtxmYW8veUKH07uWK2Gt34t3RnTwZewAGdCPO1Jyimi77L9evv+e8sVerdwN7nVI7h3s5KN0om2M96m3wNTGmqKAjNE/HrdoXPnzlqRXA07d+5k586drFvnzLRp0xpwdg3HtG6B9Gnhri0FkKiUqCSVq01pfjx7N3drUqUAV69e1f7dxsaG0aNHM27cOEaNGkVKiQUPfG7cQQhgXCdfShVKtl1K0tv+zMAWWMikBk5KxlAB0RkFJis4bK7uHPsjUisNJqvKbFfEw0G9VJlVeLf5zFhmOz8/nx9++IEPP/wQd3d3zpw5Uw9ncf95fdMlFEoVa0/GcjhKXz9RtyxAo54wrpMvYzr6cjkhh5TcYmOHRKFU8fqmSyZVFlCdZiUVUCi1Q+bfjWErDppsWZag8WH63+jVpLi4GLlcrhdQAgwbNozJkyc30KwaBwGutvw8qwcrf/yNt9fsofWgSSTllZlUKcDQoUN54YUXGD58OAMHDtSrNYqLzar0dZV5nPs72zC3Xwv+veUyhaXllb5el9IKTVDx8fFs3bqVPXv28Pzzz9O3b98anlXDcq8sSqCrLYNCPZneI7DJSr6oVJVnrvNLFMRWMAnQpbLMdkUsZBKe7BNMbGYhF+Jz9MY0me2stGRWrlzJV199RX5+fqPKTv73v/8lJCSE/v37Gx2vaVkAwLKdEby6UR2Ernq8K6FGrh9TKwuosTvXnWHhziX4pxABJVBWVsbEiRP1pGdA3RX822+/IZeb78eUk5NDTk4Orq6uvPzUY5SUlHBk19cUlpabVMapS5cudOnSxeiYpbzyjGxlHufPD2tFcm4xx25l4O+sXurWZJnc7Czxd7YhIacI3Za4spIizpy5xdatW9m4cSOXLt1tiho8eHCTCSirm0WJySxs0h7nJSUl+Pj44Ofnx9SpU5k0aRJt27bVjsdkFBi1MdVQWWa7IkvGtqeVlwMzV580+CxVQHCH7qRFnjN4XX5+Pu+99x4uLi64urri5uaGu7s77u7ueHp6/iMWhUqlktmzZ6NSqRg7dizLly+nVatWevvUtCwAIDWvxOi+FamqLKApUZdmpfI75UqvbrxEen6JWTcrCe4vTTcCqEd2797N/v37kUqleo0ZCoVC64NqrixcuJCff/4ZGxsbrah4Wloanp6eJrs8W5HaeJz7OdsQ7G7H4ZcHG7zmnfFqJ6WOS3aSW6wA1Jmunu1aGHica2jfvn2dzuGfwpw8zi0sLCgsLOTy5ctcu3aNf//734SEhDBx4kQ6dOhApsQRMJ4lrCyzXZG5/ZrzSPdAPtwVwd8RaUb3yS0wngVNS0vjjTfeqPIcJBIJUqkUuVyOXC7HwsICS0tLrK2tsba2xsbGBjs7O+zs7LC3t8fR0RFHR0ecnZ1xdnbGxcUFNzc3bbDq5eWFo6Oj1gGrsLBQ+536559/sn37dp566ikWL16Mu7s7UH9lAcaoquEtIiICJyene+rTNjSiWUnQVBABJTBy5Ej++OMPtm/fzrfffqs3dvr0abO29fLy8gKgqOjul3lAQAAzZszg+++/b6hp/aPYWckJdLU16nHeJ8SdLRcSKS7TX67+cFcErnb6GaBWXg4sGh7K1wducjY2S28p3NdBTt8pE1m/fj1KpWE7+dChQ/Hw8CAkJIQuXbowaNAghg4diq1t48nomVMWRalUcvnyZZydnUlJSdGWykRFRbFs2TIALDyD8X1ypdHXV5bZ1mVyuD+vjmzNmuMxfL6/8jrcY0cOsff3H1myZAlFRUXaufTr148PPviA9PR0MjMzycrKIisri+zsbHJzc8nLyyMvL4+CggIKCgooKiqiuLiY4uJi8vLyyMjIQKFQUF5eTnl5OTVVmNPoH2pQKNQPT1988QVffvklnTt3ZsyEycQWdKz0GNUtC6gK3Ya3kpISNm7cyOeff87Ro0eZPn06a9asqfWx7zc1bVYCCA904bVRrWnv60R+SRnbLiWxfGeE9vvGlJuVBA2L2QeUmmaBgLB+PBEaznc//MSDo4bz1FNPcf78ebp169bQU2wwVCqVgdsCQGlpKdHR0f/4fBqSQaGeBjqUVXmcn44xrLvMLVJnoi7EZ7Pr6t2MpkwqYUSHABa/8QvvvfceDz30ECdPntT+gFtZWdGmTRtiYmI4cuQIhw4d0ioSWFlZ4eXlRatWrejatStDhw6lX79+/8hypi6mmkVJT09n3759HDt2jIsXL3L79m1SU1MpKCio9DVSqZSpU6fyzvvLGfr1hRpltjUMa+PF+xM7sONKMm9tuVzpe0mAVj4udF60iJkzZ7JkyRK++uorysvL8fb2rnfJmLKyMtLT00lLSyM9PZ309HSysrLIzMzUBqqaPwUFBaSnp+uVbmhQqVRcuXKFLOxQDa88oKxuWUBVqICjlyLZ97+f+Oabb8jKykIqlSKRSP7x+6Sm1LRZqa2PI2tn9yAqNZ93tl/F28mauf2aE+xmx8zVpwDTbFYSNA7MMqCsqlkg4IXfSHOy5ESZH9Of7IuHR9Mv5q4tK1asYM+ePQbbnZ2d+d///tcAM2o4pvcIZPWxaL1t48P8SMsr4fCdhoLaUq5U8WhPdfAUFBTE4cOHefvtt1m6dCkqlYrevXuzb98+7f4RERHs2LGDI0eOcOXKFeLj49m7dy979uzh/fffB8DW1hYfHx9CQ0Pp0aMHI0aMoFu3bnoZo+qSnJyMhYUFbm5uRsdrmkV5ZmALhrXxItDVFnsrOYk5xeyPSOXz/VFkFqjrmP/JLIpCoeDEiRMcPHiQs2fPEhERQUJCAjk5OXpNehKJBHt7e3x9fWnRogVhYWHcunWLjRs3olAokEgkdOjQgQ0bNtC6dWsAAl0ja5TZBujezJWVD3fmZHQmz204T1WJwUA3W23tsru7OytXrmThwoUsXryYESNG1MOno4+FhQU+Pj74+PhUa/+LFy/SqVMnQO0lLZFIePjhh3nhhRcICwvjXGwWE746avS11S0LqA5jxo6nNOnuA49mFWD37t1MnjwZLy8vfH19CQgIoFmzZgQHB+Pn51er+6W6rF27lo8//pj333+foUOHGozXplnppRGh5BSVMe274+SXqDPC8VlFfDCpI/1aunMoMt3kmpUEjQezCiir0ywgkUhIzC1r0s0C9YWdnR2urq5kZmbqbffx8cHJyTzqJzW09HKgX4i7nsf5xEp+CCvj+O1Mmr22XW+bxvFE94tdLpfz7rvvMnjwYKZPn86gQYP0XhMaGkpoaCjPPvusdptSqeT8+fPs3LmT48ePc+3aNRITE7l58yZ//vknb7/9NgAODg74+fnRtm1bevfuzYgRI2jXrl2lncoAEydO5OrVq/z00096Wp0aappF6eDnxNWkXLZeTCS/pJwQD3umdQ9gUKgnoz87RFFZeZVZlAsXLvDUU0+xYMECpk+fXum8KxIbG8vevXs5ceIEly9fJiYmhvT0dG1tsAYrKytcXV3p1q0b7dq1o3v37gwePJiQkBCDY65Zs4Zff/0ViUTCK6+8wpIlS/SyXjXNbPs52/D9Y11RqeDPy8mM7qAfuF1PzuV6ch6gvnYGtfI0OEarVq1Yu3ZttT+X+4kmcHN0dGTBggXMnz8fX19f7XhtGt5qg4uTAylGkpwJCQlVPhxr6kutra2xtbXF0dERJycn3Nzc8PDw0DZlBQYGEhwcTIsWLbC3t6/WnA4fPsyZM2cYNmwYEyZMYMWKFQQG3s3K17RZyd5KTt8Qd1Ydvq0NJgE2novnrTFteaCDD4ci1QGqqTQrCRoXZhNQmlOzQH0xd+5cZs+ejYeHB5mZmdqmpbQ0480Bps57Ezow9JMDNRJ4vxdyqYT3JnQwOjZkyBCSkpKqVbsmlUoJDw8nPDxcb7tCoeDo0aPs2bOHkydPEhERQXR0NNevX2fjxo0sWrQIiUSCk5MTAQEBtG/fnr59+zJq1CiCg4NRKpWcO3eO4uJixo0bx8KFC1m+fLlWVqk2WZSnfzlrMP+zsVl8/WgXhrbxZOvFJKNZFKVSyccff8xrr72GQqEgODjYIKAsLCzk0KFDHD58mHPnzhEVFUVycjJ5eXl6talSqRRHR0eaN29Oq1at6Ny5M/3796d37941WgYdPHgwo0aN4tVXXzUqi1PTzHaAiw2ONhYAvDPOsBFrxZ4b2oBSN7PdWOnUqRN79+6lR48e2NnZGYzXpuGtpkiAm+ePc2DvLp555hliY2O199Q333zDrFmzSEtL4+bNm8TExBAXF0dCQgIpKSmkpaWRmZlJTk4O+fn5JCQkcPv2bRQKRZX3pUwmw9LSEhsbG+zt7XFycsLZ2VnbuOTr68vp06e1Bgpbtmzhzz//5K233mLRokVYWVnVuFkp1NsBC5mUSwn60lJl5SquJubqNVEKdy7B/cAsAkpzahaobzRP6ADnzp3Dz8+P3NzcBp5VwxDgasuSse3q1eP8/8a2qzL7LZFIqswe3gu5XE7//v0Ngp3i4mL279/Pvn37OH36NFFRUURERHDp0iXWrVsH3A26dDN4K1eu5O+//+b333+nVatWtZJ8MUZ8lnpZ2NHaQrtNN4sSFxfHo48+ysGDB7XjBw4c4PHHH+fq1avExcWRmZlJWZn+0qiNjQ0eHh6EhYXRoUMHevbsyZAhQ+qts9fX15c///yz0vGaZraNZbGNYSyz3RiRSCQMHmyodKChNg1vNUVTFjB69GiuX7/ORx99xH/+8x9KSkpwc3NDKpXi5eWFl5cXvXv3rvZxS0tLuX37Nrdu3SI2Npb4+HiSkpJITU0lIyODrKwsbT1pamoqpaWlRhvuAG3j05tvvsm///1vBg0bSUznp1GHw4YYa1byvCNLlppnqBSRmldM92auetuEO5egvjH5K8lUmwXuF8YcTaytrXn00Ufp2FFdPF9ZLZ05YCoe59bW1owaNYpRo0bpbc/NzdXKaJ07d07PQUjDpUuXCA0NZejQoWT1fZZypfEfvXtJvrjYWiCXSmnmbssrI1qjKFdy/PbdJfNypYqdl+K5+dv7rFu3zsB0IDExkZ9++gm5XI6zszPt2rWjdevWdO3alQEDBhAeHn5fa+Cqyz+d2W5q1LQsAKC1twND26gVKJq52uFgbcGCQeqShGtJuey9ngoYlgVYW1vzxhtvMGPGDFatWmW0drG6WFpaastPakJ6ejo3b95kypQpxMXFGYzb2dlRZu1MZcEkGG9WsrZQS1RVNEgAKFEoteMaTN2dS/DPY9IBpaZZoJmbLS8OC6VrMxecbSxJzC7ijwsJfHvolvbptzqNAmCakgv3cjSxn/YhLm29iUzJa7KOJvWJKXucOzo6MmnSJCZNmgTA0qVLefPNN7WZFV2P8xNnL+DSRV0naYyqJF887K049cbdH/PE7CKe3XCem2n63dOJeWWc2PA7qnLjbkPXrl3TNsA0Vhois92UqE3DW3tfJxYN1w/kNP/+/UycNqCsrCwgMDCQJUuW1MPsa45GXF4jo6TZ9vTTTzNnzhwCAgJq1axUXKa+R4zVpVrJpdpxXYwFnwJBbTHpgPL1TZfwcLDij/l9ySsu46djMWQXlhIe6MILw0Lp4OfEnJ/VXrfVaRQA05JcqK6jSYHUlu038thyXfjCajDwOEeFqoqMQlP1OL9+/bo2mAwKCmLSpEmMHTuWPn36EJFawAMra+5xDpBdVMr0749jZSGjna8jI9t5Y2tpKAIukUjYffw8+XHX+f3339m8eTP5+flIpVKUSiVJSUmNPqAE08ls3w9q0/D2+9l4fj8bX+U+jb0soFWrVrRs2ZIFCxYwfvx4LCzulnvUpllJ4x7k6WBt8BpPB2tSjLgLVfU+AkFNMdmAUtMs8MzAFjjZWDD566NEpuYDsO5UHFKphEnh/jhay8ktVlSrUQBMxx9WNCnVHY3H+cWYNIbMexuf8KHkqaxMyuN81qxZdOjQgTFjxhAaGqpXz1lVduNeki9l5SqO3FQvb++7nsqRqAw2Pt2bjIJS9t3JLmlwdfdkSHgo48aNo7S0lH379vG///2P/fv34+joWE9nev8x5cx2XTHHsoC///670rHaNCvdSM6jrFxJBz8ntus8xFnIJLT1dWT7Rf0HO8md9xEI6guTDSg1zQIOdwqO0/P1n85Sc4spV6ooK6/8C8xYowA0fckF0aRUdxITE2nfvj0dO3bk9u3bpMfG8uljfRk3aaxJeZwba+jRUJ+SL2djs0jJLWZ8mK9BQKn7PpaWlowcOZKRI0dW67iNjYqZ7aoamqDpZrZriigL0Kc2zUp5JQqORKUzobMfK/dFUnDHGWdCZ3/sreT8eVk/oNTVMBUI6gOTzXdrJBeO31ZrKC6b1JG2Po74OFkzpoMP03sGsfrobe1StgYXWws87K3o1syFxQ+2M2gUgLuSC02R+m5S2nAqtl6O1dSQSqVkZWVx4MABYmPVn8Err7zC8qXvEGAvoXOgC+18nUz6C1uTRTFGbSRfrORSHCo8vJliFiXA1Zb/PhbO+sfa82iPQMpzkqmoXi4BgtxsmdEjiD3P9+fnWT2abHBUXaZ1C2TR8Fb1cixTKAsYFOqJTKp/h92rWWn5rgicbSzYMLcX07sH8uKwVvzf2HYcvJHGgRt35d4q0zAVCOqCSf7a5ZcoiL3zZHfgRhof7opg/sAQhrW9KxWycl8kH+3WD6yq2ygAhpILaWlpfPfdd/zwww+8++67TJ069X6cWp3QNCkB92xUsraQMqVLAMPaetHaywFbKzkxGQWsOxnL2pOxaJIqptikVB28vLywtLSktPRuw1Z8fDxLliyhTZs2PPTQQw04u3+G2mRRbCxkqFAZbB/ZzhtnW0suxutr6JlqFmXBggV8++23WFlZUVJSgtzajoWv/x+hbdrRt3fPJp/Zri2iLOAutWlWupKYy/RVJ3h1ZGveGtOW/BIFG07HsWzHdb39moKGqaDpYZLfWDEZBXq1J/FZRZyMzuCvy8lkFZYxONST+QNDSMsv4adjMdr9qtsoAHclF4oSI/nss89Yt24dSqUSpVJJTEyM0dc0NBpHEx8n63s2KgW62rLkwXYcuZnO93ecF/q39OCd8R3oHOjCi79dAEyrSakmfPjhh3rBpIYnn3ySKVOmNMCMGoaaSr4Eu9uxZlYPtl1M5GZaAUqVio5+Tozv7EdcZiE/HL2t3deUsyjt2qnLZUpK1KU4iuICPvn3i0gkEjIyMswymNRgLg1v96K27lynY7KY/M2xSscbe7OSoOlikt9aus0CD3b0YemEDgz66G+Sc9WCrzuvJCOVwKsjW7PlQqK2aaAmjQIAffoNIOfWBT0pFVDX1127do2AgIBq23DVlRs3btCtWzdmz57Nv//9bwNrRF1Hkwmd/e7ZqJSWV8KITw9qxwHWnoxl2aSOTO0awGf7IonJKDSZJqWasG3bNl5++WWD7XZ2dnz77beNQvvwn6KmWZSknCJ2XE6idwt3JoX7I5dJSMgu4qdj0Xy+P0qvgceUsyhjx47Vs87U8MILL+Di4tIAM2pceNhK+WRcC7LK2zLkqcXI/DuCvbtJNbxVB3NsVhI0XUwyoNQt4n+0ZxBXEnO0waSGPddSmNI1gHY+jtogsiJVNQoAFOarHWMqWnCtWLGCFStWaP8tlUqxsLDA0tISa2tr7OzssLe3x9HRERcXF9zc3LSWXN7e3vj5+eHv709AQAC2ttV72o6IiCA3N5cVK1awevVqli9fzsyZM7XBja6jSXUalXKLFWQZ6c7deSWZqV0DCPGwJyZDvdTZ1JuUakpwcDCDBw9m//79ev/vi4qKUCgUyGTGs9qmSE2zKFmFZby++fI9j2vqWZRffvnFYJuNjQ3vvvtuA8ym8fHEE0+wfv16XFxcyMrKwtramm07duMc0BKp3NIkGt6qg2hWEjQlTPJu1JVccLe3IrfIMDCSy6R6/60MY40CoH463vvHehY9u5CTJ0/qjT399NM4OzuTlpamteDKzs4mLy+PgoICsrKySE5OpqyszMD9wxiagNTKygpra2tsbW1xcHDQBqSurq5af22lUklmZiazZs3i008/5auvvqJ37956vrDHb2fy9EB1o9IneyLJKiylS6BLpY1KunjcsffKKry73GtuvrDt2rVj7969vPvuu7z55pvaoL+wsJCsrKx6s/VrKogsSs24du0ab7/9tsH2oqIiMjIy8PX1bYBZNS5atGgBQFZWFqC2Ch06sB+enp4kJSWZ1SqA0DAVNBVMMqDUbRa4nV5Av5buBLvbcTv9bnPN2E6+lCtVXEvKrXGjAKiXWvr17M7x48dZu3YtL7zwAqmp6izmE088Qbdu3ao939LSUpKSkoiNjSUhIYHk5GRSUlL0AtKcnJwaB6QXL16kT58+OLh64Drnv1pLk5o0KuliIZPwZJ9gYjMLuVDhMzF1X1hjlpQSiQS5XM6tW7dwcXEhLi7O7IJJEFmUmmJlZcWAAQO4cOECGRn6qyM7duzgySefbKCZNR7Cw8ONbh8zZoxZBZMaRLOSoClgmr/+3G0W+PbgLQa28uDXub346Xg0WYVlDGntyaBQT9adjCU1r4S2Po7VbhQA/WYBiUTC9OnTGTduHEuXLuXXX3+lefPmNZqrpaUlQUFBBAUF1epcS0tLefXVV/nss8+0AaZGgNrHx4d+Yx/meAV/vOo2KumyZGx7Wnk5MHP1SYMvNGO+sBEREWzevJl9+/axbNkyOnXqVKvzayjuZUnpIG1Nn4UryMUWL0tLbVbFHBFZlOrTvHlz9u7dC6hXH2xsbPjuu++Ijo5m0KBBDTy7hqesrIyPPvrIYLu3tzdffPFFA8yocVCxWQmVEiSVB9em2qwkaLxIVBULAE2EyJQ8hq04CEAnfyeeG9qKdj6OONtaEpdVyP/OxvPNwVuUK1W42Frw0vBQuge74eNkrW0U2H9d7eVtrJZwz/P9G1V914svvsjHH38MgJubG/Pnz2fevHn4+voa+MI+2NGHZZM66TUqASyf1JEHOvrQ+4N9Bu4mc/s15/XRbfhwVwSf748yOoff5nSHjGg2b97Mb7/9RmRkpLZhadOmTYwfP77+T/w+UB1LSg2acWFJqUbXgUlkUYyjyXaXKJQM7NuHVxfO4vWXXmzoaTUaPvjgA1599VWD7R07duTChQsNMKPGw5EjRwgKCuLczSQef+d7AnuMIqfcwuyalQSNE5MNKAFmrDqh1yxQH2iaBRqbTM7PP//M999/z7x585g8eTKWlpbasSuJOXqeyxvm9kQmkRhIS4xo68U3M7oy/fvjeo1Kk8P9WTapI2tPxvLmH5U3VCT+dyFlqbeNjl27dq1JeC7XNSASlpTqgPzxL3Zyq9ASqQSq+hjNJSC/V7Y70NWWQaGeTO8RSEsv8w4ADhw4wPLly9m3bx9FRUXa7VKplOzsbBwczPPzyczMxM3NDUDrZT9r1ize/eBD0kskJuPOJWi6mHRAGZdZyNBPDlBShedwTbGSS9nz/IAm9cNXUKKg/eKd2h+xvS8MILeoTC9rCfBABx++eCScx384qXVVGNbGi6+mh7Pragrz152taOihR8i5L9m36y+DrncAmUyGs7Mz/v7+tG3blu7duzN06FDatm3baGqi6mJJqcui4a3M1pJSQ/fu3Tl/Kxn7zqOwad4VCxcfbQ0vmE8WRWS7a89XX33FM888Q58+fejVqxcpKSmsWrUKCwvDJklzQKVS4ejoSH5+vt52mUzGqlWrePzxxxtoZgKBGpN+jBHNAmoqOppUp1EJoHszV1Y+3JmT0Zk8t+F8lcFkkJste3Zs59q1a0yZMoVr166hVKoDeQcHB9q1a0dMTAzXrl3jwoULrFu3DlDXetrb2+Pj40OrVq3o0qULAwcOpE+fPv/oD0d9W1J62FuZ/NJtVfTv359z5z4la8+3ZPEtEgtr5C4+tG7bnnW//GwWWRTdbDdwz4y3ZvzorQyGfnLALLPdus1v6Qpr5NZ27Nq1q9ryaaaOg4ODQUApkUgICQlpoBkJBHcx6QylhvrKPL00PJT5g5rmjbt4yxWto0n3Zq6snd2DrMIyo41Kr226hJ+zDX/9qx8WMinv/nWN/GKF3vGuJ+dyPTkPUGdWZvQI0upQlpSU8Nprr/HJJ58AMH78eDZt2qR9bX5+Pvv27ePw4cOcO3eOqKgoUlNTKSzUt/CztrbG09OT5s2bExYWRt++fRk6dKiBaPu92Lp1K9HR0TzzzDNGNSJ1M9n3sqQE6NfSnTEdfAkLcCbE056knCL6Ltuvd8ymmMmuT7Zu3crYsWP1tllZWXH06NFKO3hNCZHtrj5VlQOAiiBXO1EOACxevJglS5YYbF+3bh3Tpk1rgBkJBPqYRUAJollAt0kJ7t2o1DPYlfVze1V6vBV7brBib6T238aalHbt2sXMmTN5+eWXee655+45R4VCwalTp9i3bx+nT58mIiKCxMREcnNz9ZbRLSwscHFxISgoiPbt29OrVy+GDx9eaZd89+7dOXXqFH379mXt2rUEBATojWtqbT0drNjxbH/yisv45USs1pJyStcAdl9NZs7PZwD4cHJHxnT05XJCDr7ONihVKoOAsrHW2v5THDlyhL59++pt27BhQ6P0uK9v1p+KrddVkQ8mdmjS3z2VIcoBqs/FixcrVcmIjo6utUKIQFCfmE1ACeILrKGalFQqlVbGqLZERkaye/duTpw4wZUrV4iNjSUrKwuF4m7mVCqV4ujoiJ+fH23atKFbt24MGjSIIUOGkJeXh0wmw87OjlWrVjF58mT1cXUC7WcGtuDlEa0Z9skBPcvJj6Z0YlK4Px2X7CS3WIGngxWZBaUolCpWPd6VUC8Hg4BSQ2NTA/gnSE9PJzw8nLi4OO22wMDARutxX59ost3vjm/P5C4Ble7XY+keUnJLkEslzB8UwqRwf7wcrUjJLeHX03F8deCm9j41xWy3aH6rGQqFgq+++or//e9/HDhwAECroPHbb79pv88EgobEtIuYKhDgasvPs3rcXWK5kUpshpGOSxNtFmgoR5O6BpMALVu2pGXLljzzzDN629PT09m7dy+HDx/mwoUL3L59m6ioKK5cucLvv/+ut295eTm5ublMmTKF4cOHs3btWn45kVwjS0qA1Dz98cowN0tKUGsITpw4kcTERL3tycnJlJSUYGVl1UAz+2d4fdMlFEoVa0/GcjhKX7RcIoF3x7cnPquIlFz1NbTioTBGt/fh1zNxXIrPoXOgM4uGh+LrbMPrm9RZToVSxeubLplMtrsu5QDldwLQVzdeIj2/xOTLATTI5XIWLlzIU089haWlJa6ursybN49jx44ZrLgIBA2FWQWUGlp6ObB4bDsW086oA4qpNguYYpOSu7s7Dz30EA899JDe9uLiYg4dOsRPP/3EmjVrDF63a9cu3N3dCf7Xjyht1VIcdbGkNIa5WVIWlCjYc+IiJ6JSkLoFospORlmqln0pLS3Vlh2YKpEpeWrBaeBsbDZnY7P1xrsGuWBrKWfz+QQAOvo7MaajL5/ujeSTPeoA65eTsWQWlDG7bzA/HYvmenIe5UoVh6LSiUrNa/IPuKL5rWZU/H3KiL4OwPbt2+nZs2cDz04g0Mc0I6caYGcl13N3MXXMxdHE2tqaYcOGERUVpQ0oZTIZ5eXleHl5ERoaSofwbmyzdtW+praWlFVh6paUxhoqfB5XC+yjUlGek0JB1Enyz/3FpUuXTDqg/OVEbJWlNOPC/FAqVWw5r87edmumvva2XtTP5m69mMjc/s0Z09GX68kRgGlku+MyC3l7yxU+nNyxWuUAEgk80i2Q6T0CCXKzo7C0nCuJOXy2L4qzsWqP739vuULvFu4mVQ5wL83S9q/9jz9T7HBLyTPrJiVB48M0f+UEVWJOvrBZWeofnvbt2zN58mQmTJhAhw4dkEgkXEnMYZuO4DvUzpKyKipaUqpUKs6fP89vv/3Gtm3beOeddwy6oZsC1apHlkiQOXvj0m0sjl3HckDqzJjMQpP68ddlf0RqpfeSXCrhgQ4+nInNIj5bnbW1kqn1V4srZL41mfAOfo7abZVlu69cucKKFSsIDQ1l0aJF9XYu94OalgO8PqoNc/o1Z+O5eH4+HoOjjQWPdA9kw9yeTP76KBfic0yqHKA695QKyFNZ8cvJOH46HmtSNf6Cpo8IKM2Uir6w1W1Samq+sIsWLeKJJ57Ax8fHYKy0guD9gx19WDqhg54l5c4ryUgl8OrI1my5kGhgSVkdcvMLOXMmit9++41169YRGxurzZZWrDVsCtRYX/HO8KnYnCarr6hSqdixYwedO3fG29vbYDy/REFsZqGRV6rp38oDVztLPt6doN12844GbNcgV+Kz7m7vfidz6eVorXcMTbbb1lLG3r17WbZsGbt37wagb9++DRpQ7tq1i5YtWxIcHGx0vKblADKphEd7BLH9UhIv/HrXbnH7pSQOvzyY8WF+XIjPMZlyAKFZKjAFREBpxphDk5KlpaXRYBLAUq7v0PNozyCuJObo+ZsD7LmWwpSuAbTzcdSzpKwuA/r1MbCkLC9XZ6F8fX1rfLyGxFwbKmJiYhg9ejRSqZQhQ4Ywc+ZMxo8frxXcjskooKoQYFwnX0oVSrZdStJu+zsilfisQt4Y3ZqisnIuJ+QQFqBuyikrV2Jtoa+ZqgJmLnyJo9t/JTExUc9hys7Orj5Pt0YoFApGjRqFVCpl4cKFvPnmm7i6uurtU9NyALlUgo2lzKBBLiO/lHKlSi+r29TLAcz1nhKYHiKgFJhtk1IzNzskoA0E3O2tyC0yzEDK7yxNav5bU6aOHsSGNXF6Ekcaxo0bh0wmw8nJCV9fX0JCQujUqRO9evWiX79+jcohxJwbKjQeykqlkn379rF7926sra3p2bMnPXv2xMo3FPAw+lpbSxnD2npxMDJNL8NdolDyxOpTfPFION882kW9raycpTuuM39gCIUlhtfLlm1/UpqUqJ2Lhp07dyKRSJBIJEilUmQyGTKZDAsLCywtLbG0tMTa2hpra2tsbGywtbXF1tYWe3t7HBwccHBwwMnJCScnJ5ydnXFxccHFxQV3d3ftH0tLS6PnV1hYiFKpRKlU8umnn7Jq1Srefvtt5s+fr+3qr2k5QIlCybnYLCaH+3M2NotTtzNxtLFg4eCW5BSVsfZkrPb1VTW/XblyBVdX10ofKhsac76nBKaHaUYKglpjTk1KtbWkrAlBbrasWbqKT5a9z+zZs9myZYt2TCaT8cgjjxAREUFcXByRkZFcvnyZzZs3a/exsLDA2dkZX19fWrZsSVhYGH369KF3796V/sDfDzQNFUC13IQAwgNdeG1Ua9r7OpFfUsa2S0ks3xlBYak6u9SYGyqys7M5c+YMFy5c4Pr169y6dUur+6fJLhcXF/P333/z999/Y+XdAu+Znxo91vC23thayvnjfILBWGRqPsNXHKSlpz1ONhZEpuZTXFbOWw+05cRtw2z4888uZM3K90lIuHssiUSidZPKz8+nsLBQ+6ekpITi4mJKSkrIz8+nrKyM8vJyysvLUSqV1FSG2FjAqus+pVQqyc3N5cUXX+SNN95g9OjRjHpwPLGZrpUe01g5AMBzv57n84fD+fShztptMRkFTP76KHFZRXr76ja/lZSU8Ntvv/HZZ59x6tQpHn/8cVavXl2j8/wnqEmTkoVUyuFXBle6j8bhrDHfUwLTRwSUArNmUKin1pLy24O3GNjKg1/n9jJqSanRn2zt7cDQNl4ANHO1w8HaggV3LDmvJeWy93oqoF6KG9TKEwAPDw82b97Mjz/+yPz58yksLKRFixb89NNPevNRKBScOXOGw4cPc+bMGW7cuEF8fLzWA11XW9PS0hIXFxf8/f1p1aoVnTt3pm/fvnTr1g25vGa39pNPPklISAgvv/yy0ddqGip8nKz5Y35f8orL+OlYjNZN6IVhoXTwc9K6CbX1cWTt7B5EpebzzvareDtZM7dfc4Ld7Ji5+pT6XO/RUJGQkICFhQWenp41Opd7UVZWxqVLlzh79ixXr14lMjKS+Ph4UlJSyMnJoaioyCDQqkxL1d/fn08++YThox+k03/2GF32Hh/mS36Jgt3XUiqdk66Q/sBQD2RSCUfu1Bxq5wC89dxTvLvoaVavXs1rr71GRkYGKpWKESNG8MUXX1T7M9CltLSU9PR0MjMzSU9PJysri8zMTLKzs8nJySEnJ4fc3Fzy8/PJz8+noKCAwsJCioqKKC4upqCgwOhxi4uL2bhxIztOXMZjxseVvr+xcgBQS+bcSMnjbGwWR6PS8XCw4qkBLfh2RlemfHOULJ1srwo4djmKff/7ia+//pqsrCykUilSqbRBtE+VSiUJCQlVakTWpEnJxkLGcxvOGxxjQCsPJnT241BkGmB6mqWCpoUIKAVmzfQegaw+Fg3AyehMJn19lOeGtmJGjyCtJeWyndf55uAt7Wva+zqxaHio3nE0//79TJw2oCxXqni0593lJ4lEwsyZMxkwYACzZs0y6mktl8vp0aMHPXoY/iCUlpZy/PhxrQd6ZGQkiYmJXLx4kTNnzrBu3TrtvlZWVri6uhIQEEDr1q0JDw+nX79+hIWF6dXeARQUFPDDDz8AsHnzZtatW0eLFi2047oNFRM6++FkY8Hkr49qg6B1p+KQSiVMCvfH0VpObrGCl0aEklNUxrTvjpN/Z+k2PquIDyZ1pF9Ldw5FplfaUKFQKPj444956623GD16tJ4P/L1QKpXExMRw5swZLl68SGRkJNHR0SQnJ5OZmUlhYaHR0gNLS0scHBzw9/fHz8+P4OBgWrduTadOnejatSuurq488MAD/Pnnn8jlciQSCf/5z3948cUXtQG4brZbg6udJX1C3NlyIVEve1sZVnIpLw4LJSW3mC0X9Bu2At1steUns2bNYtq0aXz88ccsXbqUwMDaL3NaWlri6+tb63peXVtAuVyOQqGgf//+vPTSS4wePZrz8TlM/Oqo0ddWVg4gk0pYM6sHx29lsnjrFe32w1Hp7HpuAPP6t+D9Hdf1jvXAg+MoTbq7fKwpCfjzzz8ZP3487u7ueHl54efnh5+fH0FBQTRv3hxHR0fqm61btzJ+/HgmT57Mxx9/bBBY1rRJqaisXPt3XSZ38Se3uEzvO8cUmpQETRMRUArMmpZeDvQLcddaUl6Iz+GJOxm0yvj9bDy/n42vch+NJaWxL/Xg4GD27dtX47laWlrSv39/+vfvbzBWWFjI4cOHOXr0KBcuXCAqKorExETOnj3LyZMn9TKhNjY2uLm5ERgYSJs2bfDy8tKOnT17lvbt2/PZZ58xe/ZsJBKJXkNFddyE7K3k9A1xZ9Xh29pgEmDjuXjeGtOWBzr4cCgyXfs56TZUXLx4kccee4yLFy+iUqm4fl0/aMjOzub06dNcuHCBa9eucfv2bRISEkhPTycvL4/S0lKDz0Zjueni4kLbtm0JCgqiVatWtG/fnq5du9KsWTODINsYGr/krl27snr1akJD9R8qdLPdGsZ09MFCJjW63A3w+cOdSc0rITIlD3trC6Z28SfQ1ZYnfjxFQal+44km263Bzs6Ot956q9Ks8j9FSYn6WpDJZEyZMoVFixbpPSxZySv/bCsrB+jezJXW3o68s/2a3vbojEJupuXTJcjF4FjODvakJhlsJiEhgfj4qu9XqVSKpaUlVlZW2tpSJycnXF1dcXNzw8vLC29vb/z8/AgMDKRZs2b4+fnpLffrEhMTg0QiYdOmTWzbto0333yTF198EWtrded+TZuUjOHhYEWv5m5sPBtPiY5iRVNvUhI0XURAKTB7GsqSsj6xtbVl+PDhDB8+3GAsNzeXgwcPcuzYMS5cuMDNmzdJTk7mxIkTHD2qnznS1NfNnTuX//znP6xcuZK91+21n0113IS6BLlgIZNyKSFH79hl5SquJubq1ehqGipeL23JkiVLWLp0qbZWEeDGjRv4+vpWuRRtY2ODk5MTbdq0ISAggJCQENq2bUt4eDgdOnSot1rTF154gf79+zN16lSjAahutlvD+DA/0vJKOFxh+VrDpYQcpnQJ4JHugRSXlXMqOpNnN5znaoV63YrZbl0a2s6yc+fOfP/99wwfPtzoEm/F5jddKisH8HBQn5NMalhqIL+jhauLBLh54Tj7d+9gwYIFxMXFaa+Vb7/9ltmzZ5Ofn090dDSxsbHExcWRkJBAamoqqampZGRkkJ2dTW5uLgUFBSQlJREdHY1CoaiyzlQikSCXy7G0tMTGxgY7OzscHR3JyVFf+5r76c033+TTTz/l7bffZs6cOTVuUjLG2I6+yKQSg8yluTl0CRoPIqAUmD2maEmpi6OjI2PGjGHMmDEGY+np6Tz77LOsW7fO4IczLi6OCVMfJuD5X7U1hNVxE/K8Ewyk5unLL2m2aXQWNcSkF2Dn5IqiWF2LpzsPpVJJSUkJAQEB2qXoNm3a0KlTJ7p06YKLi2Gm6n4REhJCSEhIpeMVs91ApUu9Gr45eEuvnMIYVWW7GwNyuZxZs2ZVOl6x+U1DVeUAt9LU5RQPdvThwI007fZ2vo4097BnnU6XN6jLAeytLXjwwQcZNmwYH330Ee+88w7FxcXaa8Te3p727dvTvn37Gp2fUqkkMTGR6OhoYmJiSEhIIDk5mZSUFDIyMsjMzCQnJ4e8vDxycnJISUmhpKTE4H5KS0tjwYIFLHzhJQKf/1VdKGmEypqUKjIuzJeU3GKO3jJs3jJ1hy5B40RcbQIB5mNJWRF3d3esrKxQqVTa+jd3d3emTp3KsGHDUDh4s2iP/g/WvdyENPqJFYXjQS0HU1FfEYmEsH7DuHn6AFlZWXoZSoBDhw7Rtm3b+j/5+4ApZLvvBzUtB7icmMvByDQmdwnA3sqCQ5FpeDpa8XivZhSXlfPfI3d1XSuWA1hbW/PGG2/w2GOP8cMPPzBs2LA6zV0qleLv74+/v3+1rUNnzJjB2rVrUSqVWhMDFxcXunXrRt8x01iVaDyYhMqblHQJdrejo78z3x++hbEEakWHLoHgn0AElALBHczJklIXa2trPD09mTp1KlOnTqV3797a2rBzsVmw526WrTpuQhrR6YrC8aCup6toNQjw7ff/pXOgC9evX2fNmjX88MMPWhehuLi4JhNQmnq2u7bUphxgzk+nmdu/OQ929GVAKw/KypWcjM7k4903uKUj61VZOUBAQAD//ve/6/U8qktGRgZKpRKJRMKIESNYsGABI0aMQCqVci42i1U1bFKqyPgwdQPV5nOVZzGNPdAJBPcTEVAKBDqYiyWlLl9++SVffPGFUWmc2rgJaeSVPB30rQM121LySgy2a96ndevWvPPOO/zf//0fhw4dYs+ePXTt2rXW59YQmGu2uypqUw5QolCycl8UK/dFVbpPYy0HmDFjBmFhYcyZM8fAjtLYg5aGqjRLdRnbyY+bqflcTqxcG7eq9xEI7gcioBQIKmAOlpQVqUxnsTZuQjficygrV9LBz4ntOst2FjIJbX0d2X5RfylPcud9dJFKpQwYMIABAwbU+pwaEnPNdleFOZUDPPzwwzz88MNGx2rTpKRLWIAzwe52fLQ7otJ9jN1TAsH9RgSUAkElmKslpS61cRPKK1FwJCqdCZ39WLkvUit/M6GzP/ZWcv68rB9Q6uormhLmmO2uClEOoKY2TUq6jOukXu7+owpJIVO9pwSNG3HFCQTVwJwsKStSGzeh5bsi2PhUbzbM7cW6k7F4O1kzp19zDt5I0+vaNaavaEqYY7a7KkQ5gJraaJYCSCXq/c7GZhFbISDVYOr3lKDxIlHV1MxVIBCYFZEpeQxbcVD7707+Tjw3tBXtfBy1bkL/OxvPNwdv6f1Adg1y4dWRrWnv50R+iYLtl5JYtuO6nmA3wJ7n+5t0EFURc81267L+VKxZlwNUvKcANj7dmwAXW3os3UNlH0n/lu789GQP3t5yhR8rNDnpYm73lKBxIAJKgUBwT2asOqHXUFEfaBoqhO+weRKXWVjjcoB+Ie4mUw4g7imBqSECSoFAcE/iMgsZ+skBPYu3umIll7Ln+QEmERwIao+5lgOIe0pgaoiAUiAQVIv1p2LrtaHig4kdmvSypaD+MbdyAHFPCUwJEVAKBIJq8/n+yHprqJg/qHIbQ4HAXBD3lMBUEAGlQCCoEebeUCEQ1DfinhKYAiKgFAgENcbcGyoEgvpG3FOCpo4IKAUCQa0x14YKgeB+Ie4pQVNFBJQCgaBeMLeGCoHgfiPuKUFTQgSUAoFAIBAIBII6IW3oCQgEAoFAIBAImjYioBQIBAKBQCAQ1AkRUAoEAoFAIBAI6oQIKAUCgUAgEAgEdUIElAKBQCAQCASCOiECSoFAIBAIBAJBnRABpUAgEAgEAoGgToiAUiAQCAQCgUBQJ0RAKRAIBAKBQCCoEyKgFAgEAoFAIBDUCRFQCgQCgUAgEAjqhAgoBQKBQCAQCAR1QgSUAoFAIBAIBII6IQJKgUAgEAgEAkGdEAGlQCAQCAQCgaBOiIBSIBAIBAKBQFAnREApEAgEAoFAIKgTIqAUCAQCgUAgENQJEVAKBAKBQCAQCOqECCgFAoFAIBAIBHVCBJQCgUAgEAgEgjohAkqBQCAQCAQCQZ0QAaVAIBAIBAKBoE6IgFIgEAgEAoFAUCdEQCkQCAQCgUAgqBMioBQIBAKBQCAQ1AkRUAoEAoFAIBAI6oQIKAUCgUAgEAgEdUIElAKBQCAQCASCOiECSoFAIBAIBAJBnRABpUAgEAgEAoGgToiAUiAQCAQCgUBQJ0RAKRAIBAKBQCCoEyKgFAgEAoFAIBDUCRFQCgQCgUAgEAjqhAgoBQKBQCAQCAR1QgSUAoFAIBAIBII68f+W96gOKUmHHwAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# set up the Rigetti Ankaa-2 device\n", - "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "\n", - "# access and visualize the device topology\n", - "# note that device topology can change day-to-day based on edge fidelity data\n", - "print(rigetti.properties.paradigm.connectivity.connectivityGraph)\n", - "nx.draw_kamada_kawai(rigetti.topology_graph, with_labels=True, font_color=\"white\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From the connectivity graph, you can see that qubits 11, 10, and 17 are connected in a line, and with the code in the next cell you can access their respective 2-qubit gate fidelities to make sure you have selected a high-quality qubit subset. " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'fISWAP': 0.9608092769094925, 'fISWAP_std_err': 0.006832379421744852}\n", - "{'fISWAP': 0.9175335256563664, 'fISWAP_std_err': 0.014230349601250074}\n" - ] - } - ], - "source": [ - "print(rigetti.properties.provider.specs[\"2Q\"][\"10-11\"])\n", - "print(rigetti.properties.provider.specs[\"2Q\"][\"10-17\"])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Note: At the time when you run this notebook the fidelity numbers may be different as QPU devices are periodically recalibrated\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After selecting the qubits and validating their gate fidelities, you can now construct a circuit and run it. " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │\n", - " ┌───────┐ ┌───────┐ ┌──────────┐ ┌───────┐ \n", - "q10 : ───StartVerbatim───┤ ISWAP ├─┤ ISWAP ├─┤ Rx(3.14) ├─┤ ISWAP ├───EndVerbatim───\n", - " ║ └───┬───┘ └───┬───┘ └──────────┘ └───┬───┘ ║ \n", - " ║ ┌───┴───┐ │ ┌───┴───┐ ║ \n", - "q11 : ─────────║─────────┤ ISWAP ├─────┼──────────────────┤ ISWAP ├────────║────────\n", - " ║ └───────┘ │ └───────┘ ║ \n", - " ║ ┌───┴───┐ ║ \n", - "q17 : ─────────╨───────────────────┤ ISWAP ├───────────────────────────────╨────────\n", - " └───────┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │\n" - ] - } - ], - "source": [ - "circ = Circuit().iswap(10, 11).iswap(10, 17).rx(10, pi).iswap(10, 11)\n", - "verbatim_circ = Circuit().add_verbatim_box(circ)\n", - "print(verbatim_circ)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[3]\n", - "PRAGMA PRESERVE_BLOCK\n", - "ISWAP 10 11\n", - "ISWAP 10 17\n", - "RX(3.141592653589793) 10\n", - "ISWAP 10 11\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 10 ro[0]\n", - "MEASURE 11 ro[1]\n", - "MEASURE 17 ro[2]\n", - "Counter({'010': 632, '011': 105, '000': 103, '110': 61, '100': 47, '111': 24, '101': 14, '001': 14})\n" - ] - } - ], - "source": [ - "result = rigetti.run(verbatim_circ, shots=1000, disable_qubit_rewiring=True).result()\n", - "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", - "print(compiled_program)\n", - "print(result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As expected, the program is faithfully executed exactly as it was defined." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Defining verbatim subcircuits " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In some situations, you might only be interested in executing parts of your circuits verbatim, and have the compiler nativize and optimize the rest. The next example demonstrates how to do this. Let's get started by defining the subcircuit we want to execute verbatim." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "verbatim_subcirc = Circuit().rx(10,pi).rx(10,pi)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, define the part of the circuit you want to compiler to process, so you don't have to worry about nativizing gates. " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "subcirc1 = Circuit().cnot(10,11).cnot(10,17)\n", - "subcirc2 = Circuit().cnot(10,17).cnot(10,11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, put everything together" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │\n", - " ┌──────────┐ ┌──────────┐ \n", - "q10 : ───●─────●─────StartVerbatim───┤ Rx(3.14) ├─┤ Rx(3.14) ├───EndVerbatim─────●─────●───\n", - " │ │ ║ └──────────┘ └──────────┘ ║ │ │ \n", - " ┌─┴─┐ │ ║ ║ │ ┌─┴─┐ \n", - "q11 : ─┤ X ├───┼───────────║──────────────────────────────────────────║──────────┼───┤ X ├─\n", - " └───┘ │ ║ ║ │ └───┘ \n", - " ┌─┴─┐ ║ ║ ┌─┴─┐ \n", - "q17 : ───────┤ X ├─────────╨──────────────────────────────────────────╨────────┤ X ├───────\n", - " └───┘ └───┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │\n" - ] - } - ], - "source": [ - "circ = subcirc1.add_verbatim_box(verbatim_subcirc).add_circuit(subcirc2)\n", - "print(circ)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", - "DECLARE ro BIT[3]\n", - "PRAGMA PRESERVE_BLOCK\n", - "RX(1.5707963267948966) 10\n", - "RZ(4.71238898038469) 10\n", - "ISWAP 10 11\n", - "RZ(1.5707963267948966) 10\n", - "RZ(3.141592653589793) 11\n", - "ISWAP 10 17\n", - "RX(1.5707963267948966) 11\n", - "RZ(1.5707963267948966) 10\n", - "RX(1.5707963267948966) 10\n", - "RZ(4.71238898038469) 10\n", - "ISWAP 10 17\n", - "RX(3.141592653589793) 10\n", - "RX(3.141592653589793) 10\n", - "RZ(3.141592653589793) 17\n", - "RZ(1.5707963267948966) 10\n", - "RX(1.5707963267948966) 17\n", - "ISWAP 10 17\n", - "RZ(1.5707963267948966) 10\n", - "RX(1.5707963267948966) 10\n", - "RZ(4.71238898038469) 10\n", - "ISWAP 10 17\n", - "RZ(1.5707963267948966) 10\n", - "RZ(3.141592653589793) 17\n", - "ISWAP 10 11\n", - "RX(1.5707963267948966) 17\n", - "RZ(1.5707963267948966) 10\n", - "RX(1.5707963267948966) 10\n", - "RZ(4.71238898038469) 10\n", - "ISWAP 10 11\n", - "RZ(3.141592653589793) 11\n", - "RX(1.5707963267948966) 11\n", - "PRAGMA END_PRESERVE_BLOCK\n", - "MEASURE 17 ro[2]\n", - "MEASURE 10 ro[0]\n", - "MEASURE 11 ro[1]\n", - "Counter({'000': 507, '001': 213, '010': 92, '011': 56, '100': 42, '111': 35, '101': 30, '110': 25})\n" - ] - } - ], - "source": [ - "result = rigetti.run(circ, shots=1000, disable_qubit_rewiring=True).result()\n", - "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", - "print(compiled_program)\n", - "print(result.measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Inspecting the compiled program, you can see that the `cnot` gates were nativized, however, the two `rx` gates in the middle of the circuit remain unaltered, and were not removed by the compiler. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Programming verbatim circuits onto the IonQ device" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "IonQ also supports verbatim compilation. Because qubits in the IonQ device have all-to-all connection, there is no restriction in qubit connectivity; all qubit pairs are available for 2-qubit gates. Because there is no circuit optimization or gate decomposition in verbatim compilation, all gates in the circuit must be native gates. Let's look at IonQ's native gate set." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The native gates for the Aria 1 device are:\n", - "GPI\n", - "GPI2\n", - "MS\n" - ] - } - ], - "source": [ - "# set up the IonQ Aria 1 device\n", - "ionq_device = AwsDevice(Devices.IonQ.Aria1)\n", - "\n", - "# list the native gate set\n", - "print(\"The native gates for the\", ionq_device.name, \"device are:\")\n", - "for gate in ionq_device.properties.paradigm.nativeGateSet:\n", - " print(gate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In `device.property`, you can see `fullyConnected=True`, showing that qubits are fully connected. This manifests as the device having a complete topology graph." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "fullyConnected=True connectivityGraph={}\n" - ] - }, - { - "data": { - "image/png": "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wZYtWxiEeCfv603PoendkpOTWcO5PNM0Dc8995wEMhRFQdu2bREWFsbepXnz5nGoVP+92NhY9O3bF5s3b8bVq1cNnsbytMz179j48eMlT6OZ6aUu4+PjTTlGCXR6U7u0bNmSUz8+/PDDCvvF7LgEABYvXgygTDHqmWeekb47f/58nn/at2+PTz75RBrXzZs3l4owHA4HOnTogAMHDqBVq1YQwri5K89OnjyJ6dOnS6k5+latWjXs2rVL6tuDBw/y3GSz2XwWJ3755ZdSSB/w8DWS182br9HMLl686NPbrB8HZp5NusawsDBMnDiRaYjot5mZmcjPz8f27ds5dE0bxWrVqvE1UK43paecOHECQpRxD1NKEs1xQpTJUHr39bhx40zXF4vFgqFDh2LXrl0oKipiAGiz2bgQjaiFXnzRU4DapEkTrFixArVr15buX///586dYx32hIQE3HHHHdyfdB1mle23qukdHlV241YFKCthKz8489s9k7N3IrDZgN8UCq2obdq0CaWlpdi+fTsGDRqE6tWrGwBg/fr1MW3aNK7M1b+oVLH95ptvltsfJFFHE1NlgUhubi5WrFjBYXQhZEAJeKppSVvaOwH++vXrBh1aITy5UKdOncKGDRuk/vVFTEuFRN4ARl/5uGLFCqn60jvs5A0e9CoblLckhExcfvr0adx7771o0KCBacWszWbDsGHDDJWXYWFh/P2KqmmBsgXD6XSiqKgIy5YtMyTNJyYm8mLkrWOsaRo2bNiA+vXr8/hRFAVxcXHo2bMn7rzzTrRt25b/Rp7YqKgovk4aExTmupFxTBybLpeL1Tz0Ou3e33e73Rg7dixWrFiBjRs3Ys+ePTh27BguXryIkpISbNu2DTk5Obww0fUEBwezR9Nut3Mf0SaEyJ+tViuCg4PL9QrrKWaioqKwdOlSSe9ZT8KtKAoeeeSRSnk9qejK6XSy55vM+3patmzJ8oH5+fmwWq1wu9037P1TVRVNmzaFzWbjIiQhPIUUZnblyhUuKqJGuaiUixsREQG32y3l8FILDAz0eS36FAVfzAXvvPMORwl8zV3Xrl1jxgq3223Y5J09e1baEHvnLr766qucl6mqKrp27SpJNV67dk2iqKI2atQo9uRTrroQnpDxxYsXsXHjRkydOhXt27cvd23w/huxXJB38K677uJr0TSNPbeUlx4SEoLA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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# access and visualize the device topology\n", - "print(ionq_device.properties.paradigm.connectivity)\n", - "nx.draw_kamada_kawai(ionq_device.topology_graph, with_labels=True, font_color=\"white\", arrows=True, arrowsize=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With this information, you can write a circuit to run verbatim on an IonQ device. IonQ currently only supports verbatim compilation for the entire circuit, so every instruction in the circuit will need to be enclosed in a verbatim box. In other words, you cannot have any gates outside of the verbatim box. As well, note that IonQ native gates cannot be used outside of a verbatim box. To learn more about IonQ native gates and the best practice of using them, see the [Amazon Braket Developer Guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html?tag=local002-20#braket-qpu-partner-ionq) and [IonQ's documentation page](https://ionq.com/docs/getting-started-with-native-gates). " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │ 3 │\n", - " ┌───────────┐ ┌──────────────────────┐ \n", - "q0 : ───StartVerbatim───┤ GPi(3.14) ├─┤ MS(0.10, 0.20, 0.30) ├───EndVerbatim───\n", - " ║ └───────────┘ └──────────┬───────────┘ ║ \n", - " ║ ┌──────────┴───────────┐ ║ \n", - "q1 : ─────────╨───────────────────────┤ MS(0.10, 0.20, 0.30) ├────────╨────────\n", - " └──────────────────────┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │\n" - ] - } - ], - "source": [ - "circ = Circuit().gpi(0,pi).ms(0, 1, 0.1, 0.2, 0.3)\n", - "verbatim_circ = Circuit().add_verbatim_box(circ)\n", - "print(verbatim_circ)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({'10': 10})\n" - ] - } - ], - "source": [ - "task = ionq_device.run(verbatim_circ, shots=10)\n", - "print(task.result().measurement_counts)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Programming verbatim circuits onto the IQM device" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The native gates of IQM Garnet are PRx and CZ. Use these gates in verbatim circuits when submiting to IQM Garnet. " - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The native gates for the Garnet device are:\n", - "cz\n", - "prx\n" - ] - } - ], - "source": [ - "# set up the IQM Garnet device\n", - "iqm_device = AwsDevice(Devices.IQM.Garnet)\n", - "\n", - "# list the native gate set\n", - "print(\"The native gates for the\", iqm_device.name, \"device are:\")\n", - "for gate in iqm_device.properties.paradigm.nativeGateSet:\n", - " print(gate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The native gates need to be programmed on the physical edegs of the device. Let's take a look at the topology of IQM Garnet, shown in the figure below. The topology is a square lattice. The edges are bi-directional where a two-qubit gate can apply on (i,j) and (j,i) where i and j are indices of two qubits. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "fullyConnected=False connectivityGraph={'1': ['2', '4'], '10': ['11', '15', '5', '9'], '11': ['12', '16', '6'], '12': ['17', '7'], '13': ['14', '8'], '14': ['15', '18', '9'], '15': ['16', '19'], '16': ['17', '20'], '18': ['19'], '19': ['20'], '2': ['5'], '3': ['4', '8'], '4': ['5', '9'], '5': ['6'], '6': ['7'], '8': ['9']}\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2FUlEQVR4nO3deWDU9YH//9ccmYTcJCQQSMIVEjUGEEVQAY0Uj2pRqv60yup+rWsvdltX7Lbsti5sS3er7R61l70VlLa2tEhbBRUrolAERQQkAQITDCQkIckkIcdk5vdHSEjINRfwmbyfj39a5nPMO77ymc8rn2tsfr/fLwAAYCz7hR4AAAC4sCgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4ZyBzOTz+VRRUaGkpCTZbLZzPSYAABABfr9fHo9HY8eOld0+8N//AZWBiooK5eTkRGxwAADg/CkvL1d2dvaA0wMqA0lJSd0rS05OjszIAADAOdXQ0KCcnJzu/fhAAioDXacGkpOTKQMAAESZoU7xcwEhAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjnhR4AzNDU6tXhmia1eX1yOe2akJ6ghFh+/S40cgEgUQZwDpVWerR6m1ub9lfJXdssf49pNkm5afEqLsjUfbNyNWV00oUapnHIBcDZbH6/3z/UTA0NDUpJSVF9fb2Sk5PPx7gQxcprm7Vs7W5tPlAth92mDt/Av2Jd0+fmjdLKRUXKSYs/jyM1C7kA5gl0/00ZQESt2e7W4+v2yOvzD7qzOZvDbpPTbtPyhYW6Z2buORyhmcgFMFOg+29OEyBintpUqic3lIS0bMfpndRXfr9b1Y2tWlI8JcKjMxe5ABgKdxMgItZsd4e8wznbkxtK9Ovt7oisy3TkAiAQHBlA2Mprm/X4uj39Tot3OfSZeZM0PSdV07JTlRrv0tLf7tILO48Ous6vr9ujqyeP4lx1GAbLZWp2iu6Yka2rJqUre+QInWxu17vuk/rOxhKVVTcNuE5yAYYnjgwgbMvW7pZ3gPPQafEufXF+viZnJGrfMU/A6/T6/Fq2dnekhmikwXL57LzJurlwjLYcrNbyF/fq+b+5NWtimtYvmaP80YkDrpNcgOGJIwMIS2mlR5sPVA84vcrTqpnffEUnGltVNC5FLy6ZE9B6O3x+bT5QrQNVHuVlcntbsIbK5advlumLv35X7R1nysL69yv08hfn6XPX5umR37zX73LkAgxPHBlAWFZvc8thtw04va3DpxONrSGt22G3adVWzlGHYqhcdrpP9ioCknS4plklVY3Kyxz4yIBELsBwRBlAWDbtrwrqVrVgdPj82lRSdU7WPdyFmsuoRJdONrUNOg+5AMMPZQAha2z1yl3bfE7fw13TrKZW7zl9j+Em1Fxunz5OWSkj9OL7FUPOSy7A8MI1AwjZkZomnZtjAmf4Jb20ZYcmpsac43caPsrq2oPOZXJGglbcVqgdR07qd0Pc6SF15nK4pkmFY1NCGiMAa6EMIGRtXt95eZ97F9+vtmORuVfeBK6sfGU98N2A589IjNXPH5gpT4tXn1u9Q4GeXThf+QM49ygDCJnLeX7OMj236hmODAShrK5dj24c+E6CnpJinfrl/5up5BExuuvHb6vKE/jFnucrfwDnHmUAIZuQniCbdE5PFdgk3XTN5XytbhAKWr1auvHlIXOJddr10weu0MRRCVr8s206UNUY8HvY1Jk/gOGBao+QJcQ6lXuOn0SXmx5PEQhSILnYbdJTn7pMM3JH6vPP7dROd11Q70EuwPDC1oywFBdk6tltRwa9je3+q8YrOS5Go5PjJEnzL87UmJTO//+rtw7LM8BV6Q67TcX5mZEftAGGyuXfbrlECy4Zo417K5U6wqXbp4/rNf0P73004LrJBRh+KAMIy32zcvXLtw8POs/Dcycpe+SZv1RvvjRLN1+aJUn6w7sfDVgGOnx+LZ7N1+aGYqhcLsnq/CrTBZeM1oJLRveZPlgZIBdg+KEMICxTRidpbt4ovXWoZsC/Qud8e1PQ63XYbbp6UjqPvA3RULnc85OtIa2XXIDhiWsGELaVi4rkHOTRt6Fw2m1auagoous0DbkACBRlAGHLSYvX8oWFEV3nioWFfE1umMgFQKAoA4iIe2bmaukN+RFZ12M3FOjumZyTjgRyARAIrhlAxCwpnqJRibF6fN0eeX3+oL4ox2G3yWm3acXCQnY4EUYuAIZi8/v9Q34yNDQ0KCUlRfX19UpOTj4f40IUK69t1rK1u7X5QLUcdtugO5+u6XPzRmnloiIOQZ9D5AKYJ9D9N2UA50xppUert7m1qaRK7prmXk/Es6nzwTXF+ZlaPDuXq9PPI3IBzEEZgKU0tXr10pYdunfx/Xpu1TM8YtgiyAUY3gLdf3MBIc6LhFinJqbGqO1YiSamxrDDsQhyASBRBgAAMB5lAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMJzzQg8gkppavTpc06Q2r08up10T0hOUEDusfsSo1dTqVVldu1xZ+Sqra1dBq5dsLIBcrInPMusartnY/H6/f6iZGhoalJKSovr6eiUnJ5+PcQWstNKj1dvc2rS/Su7aZvX8YWySctPiVVyQqftm5WrK6KQLNUwjkY01kYs1kYt1RXM2ge6/o7YMlNc2a9na3dp8oFoOu00dvoF/jK7pc/NGaeWiIuWkxZ/HkZqHbKyJXKyJXKxrOGQzrMvAmu1uPb5uj7w+/6DhnM1ht8lpt2n5wkLdMzP3HI7QXGRjTeRiTeRiXcMlm2FbBp7aVKonN5SEvZ6lN+RrSfGUCIwIXcjGmsjFmsjFuoZTNoHuv6Pqqoc12939BjQlM1Ff+li+isalKCMxVqfaO1Ra5dHTbxzSqx9W9buuJzeUKCMxVndboLkNBwNlc7YvXJenx24s0P7jHt34v2/0Ow/ZRM5AucyemKY1D1/V7zKLfrBF75bX9XmdXCJnqO2lcGyyvjQ/XzMnjFSs0yF3bbOe3+7WL9863GdecomsgbJ58s6puvPynAGXm/WtV1TZ0Np7mSjKJmrKQHltsx5ft6ffaeNGjlBirEO/23lUlQ0tGhHj0E2XjtHPHpipr/7+fT2/vbzf5b6+bo+unjzKMud2otVg2fQ0JjlOXyierKZW75Dzkk34AsnlF1vKtOtofa/XDtc0DTg/uYRvqFzmThmln95/hfZWNOh7rx1QU5tX49PiNSY5bsBlyCUyBsvmub+59eaBml6v2WzSN2+/VEdPnupTBLpESzZRUwaWrd0t7wDnbV7ff0Kv7z/R67VfvX1Y65fM0UNzJg1YBrw+v5at3a1nPz0r4uM1yWDZ9PSvH79Y77rr5LDbNDLeNei8ZBO+QHL52+Fa/eWD4wGvk1zCN1guibFOffeuadr04Ql97rkdGvokbidyiYzBstnprtNOd12v164YP1LxLqf+8N5HA64zWrKJiocOlVZ6tPlAdVAXcfj8UkV9i5JHDNx3Onx+bT5QrQNVnkgM00iBZnPlhDTdfOkYrVi/N6D1kk14gtlmElwOOey2gNZLLuEZKpfbpo1VRlKcntiwX36/NCLGIVsA0ZBL+ELZz9w2fZx8Pr/WvVcx4DzRkk1UlIHV29wBfViNiHFoZHyMctPi9elrJuq6/AxtOVgz6DIOu02rtrojNVTjBJKN3SYtX1ioX79Trv2VgW8QZBO6QLeZJ+6cpj3Lb9L+FTfp+Ydmq2hcypDLkEvohsrlmrxRamhp15jkWL36z9dq34qb9MHjN+obt12qWOfgH9fkEp5At5kuTrtNtxRlaYf7pI7WnRp03mjIJirKwKb9VQG1tX+75WK9+7Ub9MZjxVr28Yv18t5Kff2PHwy6TIfPr00l/V9kiKEFks19s8ZrXOoIfWdjcFfnkk3ohsqlrcOvP+8+puUv7tFDz2zXdzaWqGBMkn77matUmDX4HUPkErqhcpk4KkFOu00/uf8KvVF6Qp9ZtUO/2VGuxbPH64k7pw66bnIJT6D7mS7z8jOUluDSHwc5RdAlGrKx/DUDja1euWubA5r351vK9OfdxzQ6OU63TM2Sw2aTa4g2LUnummY18RjWoAWSTWp8jP55Qb7+77VS1Ta1Bf0eZBO8QHLZ6T6pzz93svvfr+yr0p8/OKaX/mmevnxTgR74xfZBlyeX4AWSS7zLoXiXU6u2HtHyFztPqb2857hcDrvumzVe391YosM1A6+DXEITzH6my23TxqrN69P63ccCmt/q2VhzVD0cqWlSoF3t4IkmHTzReSX079/9SM88eKV+ev9M3f6DLYMu55f00pYdmpgaE95gDVNW1z5kNksXFKiuuV2/evtwSO9BNsELJJf+HKlp1sZ9x3Vj4RjZbZ3X3QyEXIIXSC4t7T5J0rpdvc9B//G9Ct03a7xm5I4ctAyQS2iC3WbiXQ4tuGS03ig9obrm9oCW8avzTp3CsUOfirsQLF8G2ry+kJf9y+5j+tYnp2rSqAQdqh74dilJunfx/Wo7Fv5DJkziyspX1gPfHXD6hPR4ferKXK1Yv1ejk87cFhXrtMvpsCk7dYQ8rV7Vnxp8YyKb4AyVy2Aq6loU6+z867RxiFtAySU4geRS6WlRwZgkVTf2vk2tpqnz3ykjht7Jk0vwgt1mbrhkjOJdzoBOEfQUzv7sXLN8GQjkMP9A4mIckqSkuKF/zOdWPUObDlJZXbse3Vg94PQxyXFynH4s5/KFhX2mv/kv1+vnW8qGvMOAbIIzVC6DyU2LV0t7h5rahn4WBLkEJ5BcPvioXvOmZGh0clyvP2AyT5fpmgBOtZFL8ILdZm6fPlaNrV5t3FcZ1PuEsz871yxfBiakJ8gmDXoIJz3B1Wcjcdpt+uSMbJ1q61BpVeOg72GTdNM1l1v2XI5VFbR6tXTjywNms7/So4effafP648uKFBCrEMr1u/VkUEOeUpkE4qhcpGktARXn2s4Lh6TpI9dPFp/Laka8v52cgleILn86f1j+vx1ebp7Zo7ePnTmTqh7ZuaovcOnrYcGvzuKXEITSDZd0hJcuiZvlNbtqug+rRMImzr3Z1Zl+d+YhFinctPidWSQiztWLipSYqxTfztcq+P1LcpIitXt08cpLzNR//GnvWpu6xj0PXLT49l4QjBUNieb27Vhb9/m/OA1EyW5+p12NrIJXiDbzFOfukwt7T7tOHJSNU2tmpKZqE9dmauW9g7950v7h3wPcgleILnsOdagX28v190zc+S027S1rFazJ6bp1qlj9f1NB1Tl6f8pd13IJTSBZNPl1qlZinHYgz5FYPVsrHvMoofigsxB7/9c/36FfH6/Fs/K1Tduv1QPzZmoY/Wn9NAz2/WzN8sGXbfDblNxfmakh2yMobIJB9mEbqhcNuytVFpCjB6aO1H/cdulunXqWL2057g+8f03dfDE4EfSyCV0gWwv//qH3frvV0o0PSdVX7/lEhWOTdGK9Xv0xIbBSxq5hCfQz7Lbp4/TCU+r3jwQ+GmFaMgmKr61sLTSowX/0/+X2kTCK4/MU15m0jlb/3BGNtZELtZELtY1XLMJdP8dFUcGpoxO0ty8URH/C9Rht2lu3ig2njCQjTWRizWRi3WZnk1UlAGp87oAZ4RDctptWrmoKKLrNBHZWBO5WBO5WJfJ2URNGchJi+/39rRwrFhYaPmvlYwGZGNN5GJN5GJdJmcTNWVAku6ZmaulN+RHZF2P3VCgu2fmRmRdIBurIhdrIhfrMjWbqLiA8Gxrtrv1+Lo98vr8QX2xhMNuk9Nu04qFhVETULQhG2siF2siF+saLtkEuv+OyjIgSeW1zVq2drc2H6iWw24bNKyu6XPzRmnloqKoOGQTzcjGmsjFmsjFuoZDNsO+DHQprfRo9Ta3NpVUyV3T3OsJUjZ1PuihOD9Ti2fnWv5qzuGGbKyJXKyJXKwrmrMJeP/tD0B9fb1fkr++vj6Q2S+YxpZ2/wuvbvW7svL9L7y61d/Y0n6hh4TTyMaayMWayMW6oi2bQPffUXUB4VASYp2amBqjtmMlmpgaY+lHP5qGbKyJXKyJXKxruGYzrMoAAAAIHmUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAw1EGAAAwHGUAAADDUQYAADAcZQAAAMNRBgAAMBxlAAAAww2rMtDU6lVZXbtcWfkqq2tXU6v3Qg8Jp5GNNZGLNZGLdQ3XbGx+v98/1EwNDQ1KSUlRfX29kpOTz8e4AlZa6dHqbW5t2l8ld22zev4wNkm5afEqLsjUfbNyNWV00oUappHIxprIxZrIxbqiOZtA999RWwbKa5u1bO1ubT5QLYfdpg7fwD9G1/S5eaO0clGRctLiz+NIzUM21kQu1kQu1jUcshnWZWDNdrceX7dHXp9/0HDO5rDb5LTbtHxhoe6ZmXsOR2gusrEmcrEmcrGu4ZLNsC0DT20q1ZMbSsJez9Ib8rWkeEoERoQuZGNN5GJN5GJdwymbQPffUXUB4Zrt7ogEJElPbijRr7e7I7IukI1VkYs1kYt1mZpN1BwZKK9t1sf++69q9fr6nT4hPV6PLijQFRNGKnWESxV1p/THXR/p6c2H1NLe/zKxTrteeeRay5zbiVaDZXPp2GQ9dmOBZuSOlM1m0073Sf3nXz7U3mMNg66TbMLXlYvDbtNn5k3S9JxUTctOVWq8S0t/u0sv7DzaZ5nJGYn6+q0X64rxaWrv8Om1/VX6xp/2qbapTRK5RELP7SXe5Qgom2nZKbrz8hxNz0nVRWOSFOOwa8JX/9Q9nVwiI5htxmaT7rgsWzcWjlHh2GSlxseovPaUXny/Qj/ZfKj78/BCZzPsjgwsW7tb3gHO22SlxOmPX5ijy3JT9czbR7Ri/R7tdJ/UPy8o0PfuuWzAdXp9fi1bu/tcDdkYA2VTODZZL3z2auWkxet/Xy3V/71aqonpCVrz8GxNGpUw6DrJJnxduaTFu/TF+fmanJGofcc8A84/JjlOv3l4tsanJ+iJDfv19OZDur4gU6sevFIxDpskcomEnttLoNkUF2Tq7ity5Pf75a5t7jOdXCIjmG1mRIxDT941TemJLq3e5taK9Xu162idHvlYvn7591d2zxct2Tgv9AACUVrp0eYD1QNOX3TZOKWMiNGdP3pLpVWNkqTnt5fLbrfpjhnZSo5zqqGl772gHT6/Nh+o1oEqj/IyrXU7SLQYLJtHFxSopb1Dn/zhW6prbpckrX3vI2169Do9dmOBPrd654DrJZvw9MylytOqmd98RScaW1U0LkUvLpnT7zJfKM5TvMupTzz1pirqWyRJu8rrtPqh2bpzRrae315OLmE6e3sJNJtV247oh389qFavT8sXFmpyRmKv6eQSvmC3mfYOnz75w7e0032y+7U128t19GSz/nlBga6ZnK4tB2uiJpuoODKweptbDrttwOlJsZ2dprqxtdfrVQ0t6vD51d4x+O0gq7ZGxzkdKxosm5kTRurNA9XdRUCSTnhata2sRtdflKl4l2PQdZNN6Hrm0tbh04mzto3+3FQ4Rq9+WNldBCRpy8EaHTzRqFumju1+jVxCd/b2Emg21Y1tA54i7UIu4Ql2m2nv8PcqAl1e3lMpSb12/NGQTVSUgU37qwa9tWNrWa0k6dt3TNUlWcnKSonTrUVZum/2eP3yrTKdau8YcNkOn1+bSqoiPmZTDJaNy2nv9wPsVFuHYp0OFQzxcA6yCd1Q28zZRifHKiMpVrs/qu8zbdfROhWOPXOukVxCF2wuwSCX8EQqm4ykWEnSyea27teiIRvLnyZobPX2e46sp7+WnNCTG/brC9flacElY7pf/95rpfrOxqGvCnXXNKup1auEWMv/57CUobI5dKJJ03NSZbdJXdtYjMOm6TmpkqTRyXFDvgfZBC+QbeZsmUmdWVR5+v41VNXQqpHxLrkcdrV1dJY7cgleKLkEi1xCE8lsPjNvkhpa2vX6/t47f6tnY81R9XCkpkmBdLWjJ0/pb4dr9JcPjutkc7uuL8jUF67L04nGVj3z9pFBl/VLemnLDk1MjYnImE1RVtc+aDarth7RNxcV6dt3TNWP3jgku036x+Ip3TueuJjBTxNIZBOKoXLpT1xM50HCtn6O5HQd3YmLOVMGyCV4oeQSLHIJTaSy+fx1kzV3Sob+7Q+7+1yn5pd0uKZJhWNTIvBOkWf5MtDfh9PZPjE1S99aVKTi77yu4w2d5ztf3nNcdpv0lZsu0rpdFb3OW/fn3sX3q+1YZO4tNYUrK19ZD3x3wOmr/+ZWVuoIPTx3ku68PEdS5yHnH79xUP94/RQ1twX2BR9kE5yhculP1+23LmffM4exp187+xZdcglOKLmEglyCF4lsbi3K0tIFBVqz3a1V2/q/PiCQ/dmFYvky0N+H09kWzx6vPRX13UWgyyv7KnXXFTkqzErWloM1g67juVXP0KaDVFbXrkc3DnyXhyQ9uWG/nn7joPJHJ8nT4tX+So8eu6FAknSouimg9yGb4ASSy9mqPJ3bTubp8509ZSbH6mRzW/dRgS7kEpxQcgkFuQQv3Gzm5I3Sd/6/aXptf5X+9Q8fDDhfIPuzC8XyZWBCeoJs0qCHcEYlxqrhVN+//J0Oe6//HYhN0k3XXG7ZczlWVdDq1dKNLw95eK2hxat3jpy56vaavFGqqDulgycah3wPsgleoLn0VNnQqurTt1GdbVp2qvZW9H5IFLkEL5RcgkUuoQknm+k5qfrx4su1+2i9vvDczgEvQrSpc39mVdatKaclxDqVO8STm8qqm3TJ2GRNPOtBNgunjVWHz699QzztLjc9no0nBIFkc7Zbi7I0PSdVP99SpqGffUk2oQglF0l66YPjmn/RaGWlnLmw8+rJ6Zqckag/7z7Wa15yCV6ouQSDXEITajaTMxL18wdm6ujJU3rwV9sHvf3T6tlYd2Q9FBdk6tltRwZsXE+/cUjX5WfoNw9fpWe2HtbJ5nbNvyhTxQWZev5v7n6vkO7isNtUnJ95roY+7A2WzZUT0vRP86doc+kJnWxu12U5qbrr8my9vr9Kv3jr8JDrJpvQnZ3L/VeNV3JcTPcdHPMvztSY0zv9X711WJ5Wr77/+gF9vChLz//DbP1iy2EluBx6eN4k7TvWoN/uOPMYVnIJXX/bSyDZjEsdoUWXjZMkTT199GZJcZ4k6aO6U1r77kfkEqZgtxmf369nHrxSKSNi9PQbB3X9RaN7rc9d26Sd7jpJ0bHNRMV3E5RWerTgf94YdJ5p2Sn60sfyVZiVrNR4l8pPNut3O4/qx28cGvLe0VcemWfpJ0NZ2WDZ5KbF6xu3XarCsclKjHWq/OQp/W7nUf30zUODPgiqJ7IJzdm5vPnlYmWP7P8vnzn/9ZqO1p2SJE3JTNTXbrlEV0wYqfYOv177sErf/PNeVTe29VqGXELT3/YSSDazJ6ZpzcNX9TvP1kM1uucnWyWRSziC3WYk6c1/uX7A9b2wo1xLX3i/+98XKpth9xXGf/ezbXrrUE1EH9jhsNt09aR0PfvpWRFbp4nIxprIxZrIxbqGYzbD7ouKVi4qknOQRxKHwmm3aeWiooiu00RkY03kYk3kYl0mZxM1ZSAnLV7LFxZGdJ0rFhbylZ8RQDbWRC7WRC7WZXI2UVMGJOmemblaekN+RNb12A0FuntmbkTWBbKxKnKxJnKxLlOziZprBnpas92tx9ftkdfnD+rcjsNuk9Nu04qFhVETULQhG2siF2siF+saLtkMuwsIz1Ze26xla3dr84FqOey2QcPqmj43b5RWLiqKikM20YxsrIlcrIlcrGs4ZDPsy0CX0kqPVm9za1NJldw1zb2eIGVT54MeivMztXh2LrfcnGdkY03kYk3kYl3RnE3A+29/AOrr6/2S/PX19YHMfsE0trT7X3h1q9+Vle9/4dWt/saW9gs9JJxGNtZELtZELtYVbdkEuv+OqgsIh5IQ69TE1Bi1HSvRxNQYSz/60TRkY03kYk3kYl3DNZthVQYAAEDwKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhKAMAABiOMgAAgOEoAwAAGI4yAACA4SgDAAAYjjIAAIDhhlUZaGr1qqyuXa6sfJXVtaup1Xuhh4TTyMaayMWayMW6hms2Nr/f7x9qpoaGBqWkpKi+vl7JycnnY1wBK630aPU2tzbtr5K7tlk9fxibpNy0eBUXZOq+WbmaMjrpQg3TSGRjTeRiTeRiXdGcTaD776gtA+W1zVq2drc2H6iWw25Th2/gH6Nr+ty8UVq5qEg5afHncaTmIRtrIhdrIhfrGg7ZDOsysGa7W4+v2yOvzz9oOGdz2G1y2m1avrBQ98zMPYcjNBfZWBO5WBO5WNdwyWbYloGnNpXqyQ0lYa9n6Q35WlI8JQIjQheysSZysSZysa7hlE2g+2/neRxT2NZsd+sHrx/UIx+bouk5qZqWnarUeJeW/naXXth5tNe898zM0aLp4zQpI1HJI5yqamjV1kM1+t9XS3W07pSe3FCijMRY3W2B5jYcBJNNT067TX/5p7maMjpJ3/zzPv1k8yGyiaBgcnnyzqm68/KcPus4WNWo+f/9V3KJoDXb3XpyQ4niXQ59Zt6kgLYZm02678pc3XtlriZlJOpUe4f2HWvQf6zfSy4RFMw2c/hbtwy4ns2lJ/R3P/9b1GQTNWWgvLZZj6/bo4zEWH1xfr6OnmzWvmMeXTU5vd/5C8emqPxkszbuq1T9qXblpMXrUzNzdP1Fmbr5/zarytOqr6/bo6snj7LMuZ1oFWw2PT1w9QSNTR3R53WyCV8oubS2d+hffr+712uelvbu/08u4evKRZLS4l0BZ/PEHVN12/Rx+v3Oj/Srt48o3uVQ4dhkpSfGkkuEBLvNfOnX7/V5bWp2ih68ZqI2l1ZLip5tJmrKwLK1u+X1+VXladXMb76iE42tKhqXoheXzOl3/q/98YM+r23Yc1zr/3Gu7piRrR/+9aC8Pr+Wrd2tZz8961wPf1gLNpsu6QkuffH6KfrRGwf16IKCXtPIJnyh5OL1+fWH9z4adDq5hKcrF0kBZ3NLUZbuvDxHn3n2Hb28t7LPdIfdRi4REOw209+2MntSmnw+v9btqpAUPdtMVDxnoLTSo80HqtXh86utw6cTja0hredo3SlJUnJcZwfq8Pm1+UC1DlR5IjZW04STzb/cdJEOVTdq7bt9NyiyCU84udhtUmJs/38nkEt4euYiKeBsHpozUe+Vn9TLeytls0kjYhy9ppNL+CKxn3E57Lr50ixtK6vV8YYWSdGTTVSUgdXb3HLYbSEtmxofo/QEl4rGpeiJO6ZJkrYcrOme7rDbtGqrOyLjNFGo2UzLTtEdM7K1Yv1eaYBLWMkmdKHmMiLGoQ/+/UZ98O836r2vLdCKhYWKd/Xe8ZBL6ELJJTHWqWnZqdp1tF6P3VCg3Y/fqH0rbtIbjxXrlqKs7vnIJTzh7Ge6FBdkKGVETJ8jBtGQTVScJti0vyqoWzt62vaV+Yo93aJrm9r0+Lo9evNAdff0Dp9fm0qq9O8qjMhYTRNqNssXFmr9+xXa6a5Tdj/XDEhkE45QcqnytOrHbxzUBxUNstuka/MzdP9VE3RxVrLu+cnW7vWRS+hCyWV8Wrzsdps+MXWsOnw+/edf9qmhxasHr5mg791zmRpbvfpryQlyCVM4+5kut00fp9b2Dv3lg2O9Xo+GbCxfBhpbvXLXNoe8/N//crtinXZNzkzUounj+vyVI0nummY1tXqVMMChUfQv1GzuujxbBaOT9bnVO4ecl2yCF2ou3355f69/v/j+MR2qbtKXb7xIH790jF58/8wHHLkEL9Rc4mM7P7PSEly6/Qdb9F55nSTplX2V2vxYsZYU5+mvJSckkUuowt3PSJ1HcK6/KFOb9p9QQ0vfRxRbPRtrjqqHIzVNAx1FDsjbhzpPCbxeckIb91Zqw5fmqanNq2fePtI9j1/SS1t2aGJqTHiDNUxZXXvQ2STGOvXlGwv09OaDOlbfMuT8ZBO8UHIZyM/eLNOjCwp0Td6oXmWAXIIXai4t7T5Jkru2ubsISFJzW4de/bBKt08f1/30O3IJTSS2mZsvHaO4GMeAF+D6JR2uaVLh2JQw3+ncsHwZaPP6IrYud22z9lQ06Pbp43qVAUm6d/H9ajsW/kMmTOLKylfWA98Napl/mDtJMQ67Xnz/WPfpgTEpcZKklBExyk4doUpPi9o7zmyaZBOcUHIZSKvXp5PNbUod4eozjVyCE2oulacvRKvu54K2msZWuZx2xcc45Dn9hTnkErxIbDO3TR+nhlPteu3DqgHnieT+LNIsXwZczshe4xgXY5fL0Xedz616hjYdpLK6dj26sXroGXsYlxqn1HiXXnnk2j7TlhTnaUlxnj7+f5u191hD9+tkE5xQchlIgsuhtHiXapv67ojIJTih5lLlaVVVQ4tGJ8f1mZaZHKeW9g41tp05LE0uwQt3m8lIitVVk9L1wo6jausYeIcf6f1ZJFm+DExIT5BNA15w3i+H3aYEl6PPeZtp2SkqGJ2kP56+/7OLTdJN11xu2XM5VlXQ6tXSjS8Hlc0v3jqsDWfdJ52e4NK3PjlVv32nXBv3Vaq8x7k7sgleKLnEOu1y2m1qauvo9fo/Xj9Fdrut+5x0F3IJXii5dFm/+5gevGai5uSN6r4AemR8jBZcMlpvHaxR10PlySU04WQjSQunjpXDbhv0GR02de7PrMryvzEJsU7lpsXrSI8dxP1XjVdyXEx3U55/cWb3oeZfvXVYNpv09lfma/37x1RS5dGptg4VjEnSXZdny9Pq1fdeK+31Hrnp8Ww8IQglmz0VDdpT0dBrPV2nC0qqGvsUBbIJXii5pIyI0Z/+aa7W7arQwRONkqR5UzJ0/UWZen1/lTbsI5dw9ZeLNHQ2nlavfvD6Ad1SlKUf3jdDP3uzTJ4Wr+6dlasYu11PvPxh97rIJTShbDNdp2Uk6bbpY3W8vkVby2o0EKtnY92R9VBckKlntx3pvu3j4bmTlD3yzKMdb740Szdf2nm/7R/e/UiVnhb9+p1yXTUpXTcXjVGc06EqT4vW7arQU68d6H74kNR5FKE4P/P8/kDDSLDZ9NyAhkI2oQs2l4aWdr36YaXm5I3SHTPGyWGz6XBNs7790od6evMh9fw6M3IJ3dm5SIFtM9WNbbrzR2/pXz9+iR6cM1Exdrt2uk/qkd+8p33HOx9mQy7hCfWzbNKoBE3NTtVPztpOeoqGbKLiWwtLKz1a8D9vnLP1v/LIPOVlJp2z9Q9nZGNN5GJN5GJdwzWbQPff1r2aoYcpo5M0N29U2E+HOpvDbtPcvFFsPGEgG2siF2siF+syPZuoKAOStHJRkZwRDslpt2nloqKIrtNEZGNN5GJN5GJdJmcTNWUgJy1eyxdG9lGOKxYWWv5rJaMB2VgTuVgTuViXydlETRmQpHtm5mrpDfkRWddjNxTo7pm5EVkXyMaqyMWayMW6TM0mKi4gPNua7W49vm6PvD5/UF8s4bDb5LTbtGJhYdQEFG3IxprIxZrIxbqGSzaB7r+jsgxIUnlts5at3a3NB6q7n8s9kK7pc/NGaeWioqg4ZBPNyMaayMWayMW6hkM2w74MdCmt9Gj1Nrc2lVTJXdPc6wlSNnU+6KE4P1OLZ+da/mrO4YZsrIlcrIlcrCuaszGmDPTU1OrV4ZomtXl9cjntmpCeYOknPpmkqdWrl7bs0L2L79dzq57hkakWQS7WRC7WFW37mUD339b9CUKQEOu07NdDmi4h1qmJqTFqO1aiiakxlt54TEIu1kQu1jVc9zNRdTcBAACIPMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMMAABgOMoAAACGowwAAGA4ygAAAIajDAAAYDjKAAAAhqMM4LxoavWqrK5drqx8ldW1q6nVe6GHBJGLVZELzjeb3+/3DzVTQ0ODUlJSVF9fr+Tk5PMxLgwDpZUerd7m1qb9VXLXNqvnL5pNUm5avIoLMnXfrFxNGZ10oYZpHHKxJnLBuRDo/psygIgrr23WsrW7tflAtRx2mzp8A/+KdU2fmzdKKxcVKSct/jyO1CzkYk3kgnOJMoALYs12tx5ft0den3/QD7WzOew2Oe02LV9YqHtm5p7DEZqJXKyJXHCuBbr/dp7HMWGYe2pTqZ7cUBLSsh2nPwy/8vvdqm5s1ZLiKREenbnIxZrIBVbCBYSIiDXb3SF/sJ3tyQ0l+vV2d0TWZTpysSZygdVwmgBhK69t1sf++69y2G36zLxJmp6TqmnZqUqNd2npb3fphZ1H+yxzS1GWHpozUZMzEtXh96vkuEc/euOQNu2vkiTFOu165ZFrOScahlByuf+q8bp/9gTlpI3QyaZ2rd9doe9sKNGp9g5J5BIJXbkUjEnSHTOyddWkdGWPHKGTze16131S39lYorLqpl7LTM5I1NdvvVhXjE9Te4dPr+2v0jf+tE+1TW2SyAUDC3T/zZEBhG3Z2t3y+vxKi3fpi/PzNTkjUfuOeQac/4GrJuj7985QbXOb/uulD/W910qVFOfUL/5+pm4sHCNJ8vr8WrZ29/n6EYalYHP5yk0XacXCS7W/0qMVL+7VX/Yc0wNXTdCPF1/ePQ+5hK8rl8/Om6ybC8doy8FqLX9xr57/m1uzJqZp/ZI5yh+d2D3/mOQ4/ebh2RqfnqAnNuzX05sP6fqCTK168ErFOGySyAXh45oBhKW00qPNB6olSVWeVs385is60diqonEpenHJnH6XeeDq8XqvvE6f/tU73a/95p2j2vrV+bpzxji9vOe4Onx+bT5QrQNVHuVlchtVsILNJSMpVp+eM1G/23lUj/52V/frZdVNWrHwUs2/KFOvflhFLmHqmctP3yzTF3/9rto7zhycXf9+hV7+4jx97to8PfKb9yRJXyjOU7zLqU889aYq6lskSbvK67T6odm6c0a2nt9eTi4IG0cGEJbV29xy2Dv/Omnr8OlEY+uQyyTFOlXT1Hu+xlavmlu9amn3db/msNu0aivnQkMRbC4zckcqxmHXi+9X9Hr9xV2d//7EtLHdr5FL6HrmstN9slcRkKTDNc0qqWpUXuaZIwM3FY7Rqx9WdhcBSdpysEYHTzTqlqnkgsigDCAsm/ZXBXVLlCRtPVSra6dk6IGrJig7dYQmZyRoxcJCJcXF6BdvlXXP1+Hza1NJVaSHbIRgc4l1dn4UtPYoY5K6rxUoGpvS/Rq5hC6QXEYlunTy9LUAo5NjlZEUq90f1feZb9fROhWOPXMOmFwQDk4TIGSNrV65a5uDXu7fX9yjkQkuLV9YqOULCyVJNY2tuu9nW7XTXddrXndNs5pavUqI5Vc1UKHkcvBEoyTp8vEj9fahmu7Xr5yQJkkanRLXa35yCV4gudw+fZyyUkbouxs77zTITOr8717l6Xtkp6qhVSPjXXI57Grr6Cxx5IJQ8RuDkB2paVJwxwQ6nWrv0KETjTpef0qvflilxFinHrxmon503+W66+m3daTmzAemX9JLW3ZoYmpMxMY93JXVtQedy56KBr3rPqnPXjtZlQ0tevtgjfIyE/WN2y9Vm9enOGfvg4jkEryhcpmckaAVtxVqx5GT+t3pOz3iYjr/u7d5fX3mbz39WlzMmTLgl3S4pkmFPY7kAIGgDCBk/X1ABeIH986Q1+fXQ8+cuYBww95Kvb70Oj12Q4GWPP9ur/nvXXy/2o5F5p5sE7iy8pX1wHeDXu6zq3foqU/N0BN3TpMkeTt8+umbZZo9KU2TRiX2mZ9cgjNYLhmJsfr5AzPlafHqc6t3qOtMQtc1NC5n3zO6Xad2Ws46tRPqdgmzUQYQsv4+oIaSM3KErivI1Fd+/36v1+tPteudw7W6fPzIPss8t+oZ/gINQlldux7dWB30cpUNrbrrx29rQnq8MpJidbi6WScaW7Xtq/N16Kz73iVyCdZAuSTFOvXL/zdTySNidNeP3+51SqDK03nRYGZSbJ/lMpNjdbK5rfuoQJdQtkuAMoCQTUhPkE0K6pB0xukPNYfN1mea02GX0977dZukm665nHOgQSho9WrpxpdDOoUjdV7Rfvj0qZq8zESNTo7TCzt6P6CIXILXXy6xTrt++sAVmjgqQYt/tk0Hqhp7LVPZ0Krq07eEnm1adqr2VjT0es2mzu0SCBYVEiFLiHUqN8gnnh2uaVaHz69be9wSJXU+WGXmhDTtOevDLTc9nh1OkELJpT82m/TVmy9Sc5tXq7cd6TWNXIJ3di52m/TUpy7TjNyR+vxzO/tcPNvlpQ+Oa/5Fo5XV4yLOqyena3JGov68+1iveckFoeK3BmEpLsjUs9uOdN8udf9V45UcF6PRyZ0fXPMvztSY0x9iv3rrsGqb2vSbd8r1qStz9dxDs/TSnuNKdDm1ePZ4xTnt+sHrB7vX7bDbVJyfef5/qGEg2Fw8rV49fuslinXatfdYg5wOu26bNlbTslP16Au7et3jTi6h65nLv91yiRZcMkYb91YqdYRLt08f12veP7z3kSTp+68f0MeLsvT8P8zWL7YcVoLLoYfnTdK+Yw36bY8jNuSCcPDdBAhLaaVHC/7nje5/v/nlYmWP7P+v0jn/9ZqO1p2Sw27TfbNydfcVORp/+pDm+0fr9L3XDvS6rU2SXnlkHk9UC0Eoudw5I1sPXjNB49MT5PP7tetovb6/qW8mErmEqmcua/5htmZPSh9w3glf/VP3/5+Smaiv3XKJrpgwUu0dfr32YZW++ee9qm5s67UMueBsge6/KQMI29/9bJveOlQT9MOHBuOw23T1pHQ9++lZEVunacjFmsgF5xNfVITzZuWioj4X/oXLabdp5aKiiK7TNORiTeQCK6IMIGw5afHdTxKMlBULC/k61jCRizWRC6yIMoCIuGdmrpbekB+RdT12Q4HunpkbkXWZjlysiVxgNdxNgIhZUjxFoxJj9fi6PfL6/EGdE3XYbXLabVqxsJAPtggjF2siF1gJFxAi4sprm7Vs7W5tPlAth9026Idc1/S5eaO0clERhzrPIXKxJnLBucTdBLjgSis9Wr3NrU0lVXLXNPd68ppNnQ9IKc7P1OLZudwOdR6RizWRC84FygAspanVq8M1TWrz+uRy2jUhPYEnpVkAuVgTuSBSAt1/89uF8yIh1snXqloQuVgTueB8424CAAAMRxkAAMBwlAEAAAxHGQAAwHCUAQAADEcZAADAcJQBAAAMRxkAAMBwlAEAAAxHGQAAwHCUAQAADEcZAADAcJQBAAAMRxkAAMBwlAEAAAxHGQAAwHDOQGby+/2SpIaGhnM6GAAAEDld++2u/fhAAioDHo9HkpSTkxPmsAAAwPnm8XiUkpIy4HSbf6i6IMnn86miokJJSUmy2WwRHSAAADg3/H6/PB6Pxo4dK7t94CsDAioDAABg+OICQgAADEcZAADAcJQBAAAMRxkAAMBwlAEAAAxHGQAAwHCUAQAADPf/A21jArTSrQIWAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# access and visualize the device topology\n", - "print(iqm_device.properties.paradigm.connectivity)\n", - "\n", - "nx.draw_networkx(\n", - " iqm_device.topology_graph,\n", - " pos={\n", - " 1: (-1,2), 2: (0,2),\n", - " 3: (-2,1), 4: (-1,1), 5: (0,1), 6: (1,1), 7: (2,1),\n", - " 8: (-2,0), 9: (-1,0), 10: (0,0), 11: (1,0), 12: (2,0),\n", - " 13: (-2,-1), 14: (-1,-1), 15: (0,-1), 16: (1,-1), 17: (2,-1),\n", - " 18: (-1,-2), 19: (0,-2), 20: (1,-2),\n", - " },\n", - " arrows=False,\n", - " with_labels=True,\n", - " font_color=\"white\", \n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's compose a verbatim circuit to IQM Garnet. The circuit below creates a Bell state. With verbatim compilation, you have control in preparing a quantum state. There is no gate optimization and you can experiment with different ways to create the quantum state." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │\n", - " ┌──────────────┐ \n", - "q1 : ───StartVerbatim───┤ PRx(1.57, 0) ├───●───────────────────────EndVerbatim───\n", - " ║ └──────────────┘ │ ║ \n", - " ║ ┌──────────────┐ ┌─┴─┐ ┌───────────────┐ ║ \n", - "q2 : ─────────╨─────────┤ PRx(1.57, 0) ├─┤ Z ├─┤ PRx(-1.57, 0) ├────────╨────────\n", - " └──────────────┘ └───┘ └───────────────┘ \n", - "T : │ 0 │ 1 │ 2 │ 3 │ 4 │\n" - ] - } - ], - "source": [ - "circ = Circuit().prx(1, pi/2, 0).prx(2, pi/2, 0).cz(1,2).prx(2, -pi*0.5, 0)\n", - "verbatim_circ = Circuit().add_verbatim_box(circ)\n", - "print(verbatim_circ)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion \n", - "This notebook introduced the basic functionality of verbatim compilation of Amazon Braket, that allows you to run circuits or subcircuits to be executed exactly as defined without any compiler modifications. You can find further information in the [Amazon Braket documentation](https://docs.aws.amazon.com/braket/). " - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Quantum Task Summary\n", - "{<_Rigetti.Ankaa2: 'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2'>: {'shots': 5000, 'tasks': {'COMPLETED': 5}}, <_IonQ.Aria1: 'arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1'>: {'shots': 10, 'tasks': {'COMPLETED': 1}}}\n", - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run this example: 6.600 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" - ] - } - ], - "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.10" - }, - "vscode": { - "interpreter": { - "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" - } - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Verbatim compilation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", + "from braket.tracking import Tracker\n", + "\n", + "t = Tracker().start()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Usually, when you run a circuit on a QPU, behind the scenes, Amazon Braket will do a series of compilation steps to optimize your circuit and map the abstract circuit to the physical qubits on the QPU. However, in many situations, such as for error mitigation or benchmarking experiments, researchers require full control of the qubits and the gates that are being applied. In a [previous notebook](https://github.com/amazon-braket/amazon-braket-examples/blob/main/examples/braket_features/Allocating_Qubits_on_QPU_Devices.ipynb), we showed you how to manually allocate the qubits of your circuit, i.e., how you can exactly define which logical qubit maps to which physical qubit. In this notebook, you will learn how to use _verbatim compilation_ to run your circuits exactly as defined without any modification during the compilation process.\n", + "\n", + "### Table of contents:\n", + "\n", + "* [Recap: Running circuits on Amazon Braket](#Recap)\n", + "* [Using verbatim compilation to run circuits without further compilation](#Verbatim)\n", + "* [Programming verbatim circuits onto the Rigetti device](#Rigetti)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Recap: Running circuits on Amazon Braket " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us begin with importing the usual dependencies. Verbatim compilation is supported by all Rigetti devices, and we will use the Ankaa-2 device for this demonstration." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# general imports\n", + "from math import pi\n", + "\n", + "import networkx as nx\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit\n", + "from braket.devices import Devices\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you run a circuit on Amazon Braket, different compilation and optimization steps occur before the circuit is executed on the selected QPU. First, the gates of your circuit are decomposed into the _native gates_ of the QPU. Let's first remember what the native gates of the Ankaa-2 device are:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The native gates for the Ankaa-2 device are:\n", + "rx\n", + "rz\n", + "cz\n", + "iswap\n" + ] + } + ], + "source": [ + "# set up the Rigetti Ankaa-2 device\n", + "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "\n", + "# list the native gate set\n", + "print(\"The native gates for the\", device.name, \"device are:\")\n", + "for gate in device.properties.paradigm.nativeGateSet:\n", + " print(gate)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we create a circuit with gates that are not part of that list, the gates will automatically be decomposed into a gate set that can be executed on the device." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │\n", + " ┌───┐ \n", + "q0 : ─┤ H ├───●───\n", + " └───┘ │ \n", + " ┌─┴─┐ \n", + "q1 : ───────┤ X ├─\n", + " └───┘ \n", + "T : │ 0 │ 1 │\n", + "Counter({'00': 482, '11': 423, '10': 54, '01': 41})\n" + ] + } + ], + "source": [ + "bell = Circuit().h(0).cnot(0, 1)\n", + "print(bell)\n", + "result = device.run(bell, shots=1000).result()\n", + "print(result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's have a look at the circuit that was actually executed. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[2]\n", + "PRAGMA PRESERVE_BLOCK\n", + "RX(1.5707963267948966) 76\n", + "RZ(3.141592653589793) 76\n", + "ISWAP 76 75\n", + "RZ(1.5707963267948966) 76\n", + "RX(1.5707963267948966) 76\n", + "RZ(4.71238898038469) 76\n", + "ISWAP 76 75\n", + "RZ(3.141592653589793) 75\n", + "RX(1.5707963267948966) 75\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 76 ro[0]\n", + "MEASURE 75 ro[1]\n" + ] + } + ], + "source": [ + "meta = result.additional_metadata.rigettiMetadata\n", + "print(meta.compiledProgram)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, the original gates, `h` and `cnot`, were decomposed into the native `rz`, `rx`, and `iswap`. You will also note that the abstract qubit indices 0 and 1 (which were chosen as an example) were remapped to qubits that actually exist on the device, in this case, 5 and 6, respectively. At the time when you run this notebook, you might see a different remapping, as the compiler takes into account the latest calibration of the device and tries to map to the qubits that yield the best results. \n", + "\n", + "The compiler further performs circuit optimizations to minimize the number of operations, e.g., by removing redundant gates. Let's have a look at a single-qubit circuit containing two subsequent `x` gates:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "identity = Circuit().x(0).x(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Of course, if you do the math, two consecutive `x` gates just cancel each other out, and we are left with an empty circuit after compilation." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[1]\n", + "PRAGMA PRESERVE_BLOCK\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 0 ro[0]\n", + "Counter({'0': 918, '1': 82})\n" + ] + } + ], + "source": [ + "result = device.run(identity, shots=1000).result()\n", + "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", + "print(compiled_program)\n", + "print(result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using verbatim compilation to run circuits without further compilation " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In some cases, however, you may need to run circuits exactly as defined, without any further modifications by the compiler. For instance, if you want to benchmark device performance you may want to control exactly which gates are executed on the hardware. Similarly, [certain error mitigation protocols](https://arxiv.org/pdf/2005.10921.pdf) require insertion of additional, redundant operations that would normally be removed by the compiler but are essential for the protocol to work. To prevent circuits (or parts of circuits) from further compiler optimizations, you can use the `add_verbatim_box` function in the Amazon Braket SDK." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " Note: add_verbatim_box is currently supported on Rigetti, IonQ, and IQM devices.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you define a (sub-)circuit in a verbatim box, you need to make sure that everything inside the verbatim box can be executed on the device _exactly_ as you defined it. This means that\n", + "1. The circuit can only use qubit indices that exist on the device\n", + "2. All gates of the circuit have to be part of the native gate set of the device\n", + "3. All multi-qubit gates have to be between qubits that are connected according to the connectivity graph of the device " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Getting started with a minimal example\n", + "Let's have a look at the simple example from before of an identify circuit. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "identity = Circuit().rx(0, pi).rx(0, pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we have chosen the Rigetti-native `rx` gate, which is identical to `x` if we choose the angle to be $\\pi$. Next, we wrap this circuit in a verbatim box to prevent the compiler from collapsing the two gates. You can see the circuit diagram indicates the start and end of the verbatim box." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │ 3 │\n", + " ┌──────────┐ ┌──────────┐ \n", + "q0 : ───StartVerbatim───┤ Rx(3.14) ├─┤ Rx(3.14) ├───EndVerbatim───\n", + " └──────────┘ └──────────┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │\n" + ] + } + ], + "source": [ + "circ = Circuit().add_verbatim_box(identity)\n", + "print(circ)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we run the circuit, both gates will be executed on the device." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " Note: To run a circuit that contains a verbatim box the disable_qubit_rewiring flag must be set to True \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[1]\n", + "PRAGMA PRESERVE_BLOCK\n", + "RX(3.141592653589793) 0\n", + "RX(3.141592653589793) 0\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 0 ro[0]\n", + "Counter({'0': 909, '1': 91})\n" + ] + } + ], + "source": [ + "result = device.run(circ, shots=1000, disable_qubit_rewiring=True).result()\n", + "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", + "print(compiled_program)\n", + "print(result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Programming verbatim circuits onto the Rigetti device " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we have mentioned above, to build circuits with multi-qubit gates, you need to take into consideration the connectivity graph of the device. When a circuit contains a verbatim box, automatic qubit rewiring has to be disables, and you have manually allocate the qubits on the device that you want to use for your circuit.\n", + "You can access the connectivity graph on the [device detail page](https://console.aws.amazon.com/braket/home?region=us-west-1#/devices/arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2) in the Amazon Braket Console, or by using the code below." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'0': ['1', '7'], '1': ['0', '2', '8'], '2': ['1', '3', '9'], '3': ['2', '4', '10'], '4': ['3', '5', '11'], '5': ['4', '6', '12'], '6': ['5', '13'], '7': ['0', '8', '14'], '8': ['1', '7', '9', '15'], '9': ['2', '8', '10', '16'], '10': ['3', '9', '11', '17'], '11': ['4', '10', '12', '18'], '12': ['5', '11', '13', '19'], '13': ['6', '12', '20'], '14': ['7', '15', '21'], '15': ['8', '14', '22'], '16': ['9', '17', '23'], '17': ['10', '16', '18', '24'], '18': ['11', '17', '19', '25'], '19': ['12', '18', '20', '26'], '20': ['13', '19', '27'], '21': ['14', '22', '28'], '22': ['15', '21', '23', '29'], '23': ['16', '22', '24', '30'], '24': ['17', '23', '25', '31'], '25': ['18', '24', '26', '32'], '26': ['19', '25', '33'], '27': ['20', '34'], '28': ['21', '29', '35'], '29': ['22', '28', '30', '36'], '30': ['23', '29', '31', '37'], '31': ['24', '30', '32', '38'], '32': ['25', '31', '33', '39'], '33': ['26', '32', '34', '40'], '34': ['27', '33', '41'], '35': ['28', '36', '42'], '36': ['29', '35', '37', '43'], '37': ['30', '36', '38', '44'], '38': ['31', '37', '39', '45'], '39': ['32', '38', '40', '46'], '40': ['33', '39', '41', '47'], '41': ['34', '40', '48'], '42': ['35', '43', '49'], '43': ['36', '42', '44', '50'], '44': ['37', '43', '45', '51'], '45': ['38', '44', '46', '52'], '46': ['39', '45', '47', '53'], '47': ['40', '46', '48', '54'], '48': ['41', '47', '55'], '49': ['42', '56'], '50': ['43', '51', '57'], '51': ['44', '50', '52', '58'], '52': ['45', '51', '53', '59'], '53': ['46', '52', '54'], '54': ['47', '53', '55', '61'], '55': ['48', '54', '62'], '56': ['49', '57', '63'], '57': ['50', '56', '58', '64'], '58': ['51', '57', '59', '65'], '59': ['52', '58', '60', '66'], '60': ['59'], '61': ['54', '62', '68'], '62': ['55', '61', '69'], '63': ['56', '64', '70'], '64': ['57', '63', '65', '71'], '65': ['58', '64', '66', '72'], '66': ['59', '65', '67'], '67': ['66', '68', '74'], '68': ['61', '67', '69', '75'], '69': ['62', '68', '76'], '70': ['63', '71', '77'], '71': ['64', '70', '72', '78'], '72': ['65', '71', '73', '79'], '73': ['72', '74', '80'], '74': ['67', '73', '75', '81'], '75': ['68', '74', '76', '82'], '76': ['69', '75', '83'], '77': ['70', '78'], '78': ['71', '77', '79'], '79': ['72', '78', '80'], '80': ['73', '79', '81'], '81': ['74', '80', '82'], '82': ['75', '81', '83'], '83': ['76', '82']}\n" + ] }, - "nbformat": 4, - "nbformat_minor": 4 + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# set up the Rigetti Ankaa-2 device\n", + "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "\n", + "# access and visualize the device topology\n", + "# note that device topology can change day-to-day based on edge fidelity data\n", + "print(rigetti.properties.paradigm.connectivity.connectivityGraph)\n", + "nx.draw_kamada_kawai(rigetti.topology_graph, with_labels=True, font_color=\"white\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From the connectivity graph, you can see that qubits 11, 10, and 17 are connected in a line, and with the code in the next cell you can access their respective 2-qubit gate fidelities to make sure you have selected a high-quality qubit subset. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'fISWAP': 0.9608092769094925, 'fISWAP_std_err': 0.006832379421744852}\n", + "{'fISWAP': 0.9175335256563664, 'fISWAP_std_err': 0.014230349601250074}\n" + ] + } + ], + "source": [ + "print(rigetti.properties.provider.specs[\"2Q\"][\"10-11\"])\n", + "print(rigetti.properties.provider.specs[\"2Q\"][\"10-17\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " Note: At the time when you run this notebook the fidelity numbers may be different as QPU devices are periodically recalibrated\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After selecting the qubits and validating their gate fidelities, you can now construct a circuit and run it. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │\n", + " ┌───────┐ ┌───────┐ ┌──────────┐ ┌───────┐ \n", + "q10 : ───StartVerbatim───┤ ISWAP ├─┤ ISWAP ├─┤ Rx(3.14) ├─┤ ISWAP ├───EndVerbatim───\n", + " ║ └───┬───┘ └───┬───┘ └──────────┘ └───┬───┘ ║ \n", + " ║ ┌───┴───┐ │ ┌───┴───┐ ║ \n", + "q11 : ─────────║─────────┤ ISWAP ├─────┼──────────────────┤ ISWAP ├────────║────────\n", + " ║ └───────┘ │ └───────┘ ║ \n", + " ║ ┌───┴───┐ ║ \n", + "q17 : ─────────╨───────────────────┤ ISWAP ├───────────────────────────────╨────────\n", + " └───────┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │\n" + ] + } + ], + "source": [ + "circ = Circuit().iswap(10, 11).iswap(10, 17).rx(10, pi).iswap(10, 11)\n", + "verbatim_circ = Circuit().add_verbatim_box(circ)\n", + "print(verbatim_circ)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[3]\n", + "PRAGMA PRESERVE_BLOCK\n", + "ISWAP 10 11\n", + "ISWAP 10 17\n", + "RX(3.141592653589793) 10\n", + "ISWAP 10 11\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 10 ro[0]\n", + "MEASURE 11 ro[1]\n", + "MEASURE 17 ro[2]\n", + "Counter({'010': 632, '011': 105, '000': 103, '110': 61, '100': 47, '111': 24, '101': 14, '001': 14})\n" + ] + } + ], + "source": [ + "result = rigetti.run(verbatim_circ, shots=1000, disable_qubit_rewiring=True).result()\n", + "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", + "print(compiled_program)\n", + "print(result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As expected, the program is faithfully executed exactly as it was defined." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Defining verbatim subcircuits " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In some situations, you might only be interested in executing parts of your circuits verbatim, and have the compiler nativize and optimize the rest. The next example demonstrates how to do this. Let's get started by defining the subcircuit we want to execute verbatim." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "verbatim_subcirc = Circuit().rx(10, pi).rx(10, pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, define the part of the circuit you want to compiler to process, so you don't have to worry about nativizing gates. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "subcirc1 = Circuit().cnot(10, 11).cnot(10, 17)\n", + "subcirc2 = Circuit().cnot(10, 17).cnot(10, 11)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, put everything together" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │\n", + " ┌──────────┐ ┌──────────┐ \n", + "q10 : ───●─────●─────StartVerbatim───┤ Rx(3.14) ├─┤ Rx(3.14) ├───EndVerbatim─────●─────●───\n", + " │ │ ║ └──────────┘ └──────────┘ ║ │ │ \n", + " ┌─┴─┐ │ ║ ║ │ ┌─┴─┐ \n", + "q11 : ─┤ X ├───┼───────────║──────────────────────────────────────────║──────────┼───┤ X ├─\n", + " └───┘ │ ║ ║ │ └───┘ \n", + " ┌─┴─┐ ║ ║ ┌─┴─┐ \n", + "q17 : ───────┤ X ├─────────╨──────────────────────────────────────────╨────────┤ X ├───────\n", + " └───┘ └───┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │\n" + ] + } + ], + "source": [ + "circ = subcirc1.add_verbatim_box(verbatim_subcirc).add_circuit(subcirc2)\n", + "print(circ)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRAGMA INITIAL_REWIRING \"NAIVE\"\n", + "DECLARE ro BIT[3]\n", + "PRAGMA PRESERVE_BLOCK\n", + "RX(1.5707963267948966) 10\n", + "RZ(4.71238898038469) 10\n", + "ISWAP 10 11\n", + "RZ(1.5707963267948966) 10\n", + "RZ(3.141592653589793) 11\n", + "ISWAP 10 17\n", + "RX(1.5707963267948966) 11\n", + "RZ(1.5707963267948966) 10\n", + "RX(1.5707963267948966) 10\n", + "RZ(4.71238898038469) 10\n", + "ISWAP 10 17\n", + "RX(3.141592653589793) 10\n", + "RX(3.141592653589793) 10\n", + "RZ(3.141592653589793) 17\n", + "RZ(1.5707963267948966) 10\n", + "RX(1.5707963267948966) 17\n", + "ISWAP 10 17\n", + "RZ(1.5707963267948966) 10\n", + "RX(1.5707963267948966) 10\n", + "RZ(4.71238898038469) 10\n", + "ISWAP 10 17\n", + "RZ(1.5707963267948966) 10\n", + "RZ(3.141592653589793) 17\n", + "ISWAP 10 11\n", + "RX(1.5707963267948966) 17\n", + "RZ(1.5707963267948966) 10\n", + "RX(1.5707963267948966) 10\n", + "RZ(4.71238898038469) 10\n", + "ISWAP 10 11\n", + "RZ(3.141592653589793) 11\n", + "RX(1.5707963267948966) 11\n", + "PRAGMA END_PRESERVE_BLOCK\n", + "MEASURE 17 ro[2]\n", + "MEASURE 10 ro[0]\n", + "MEASURE 11 ro[1]\n", + "Counter({'000': 507, '001': 213, '010': 92, '011': 56, '100': 42, '111': 35, '101': 30, '110': 25})\n" + ] + } + ], + "source": [ + "result = rigetti.run(circ, shots=1000, disable_qubit_rewiring=True).result()\n", + "compiled_program = result.additional_metadata.rigettiMetadata.compiledProgram\n", + "print(compiled_program)\n", + "print(result.measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Inspecting the compiled program, you can see that the `cnot` gates were nativized, however, the two `rx` gates in the middle of the circuit remain unaltered, and were not removed by the compiler. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Programming verbatim circuits onto the IonQ device" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "IonQ also supports verbatim compilation. Because qubits in the IonQ device have all-to-all connection, there is no restriction in qubit connectivity; all qubit pairs are available for 2-qubit gates. Because there is no circuit optimization or gate decomposition in verbatim compilation, all gates in the circuit must be native gates. Let's look at IonQ's native gate set." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The native gates for the Aria 1 device are:\n", + "GPI\n", + "GPI2\n", + "MS\n" + ] + } + ], + "source": [ + "# set up the IonQ Aria 1 device\n", + "ionq_device = AwsDevice(Devices.IonQ.Aria1)\n", + "\n", + "# list the native gate set\n", + "print(\"The native gates for the\", ionq_device.name, \"device are:\")\n", + "for gate in ionq_device.properties.paradigm.nativeGateSet:\n", + " print(gate)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In `device.property`, you can see `fullyConnected=True`, showing that qubits are fully connected. This manifests as the device having a complete topology graph." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fullyConnected=True connectivityGraph={}\n" + ] + }, + { + "data": { + "image/png": "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wZYtWxiEeCfv603PoendkpOTWcO5PNM0Dc8995wEMhRFQdu2bREWFsbepXnz5nGoVP+92NhY9O3bF5s3b8bVq1cNnsbytMz179j48eMlT6OZ6aUu4+PjTTlGCXR6U7u0bNmSUz8+/PDDCvvF7LgEABYvXgygTDHqmWeekb47f/58nn/at2+PTz75RBrXzZs3l4owHA4HOnTogAMHDqBVq1YQwri5K89OnjyJ6dOnS6k5+latWjXs2rVL6tuDBw/y3GSz2XwWJ3755ZdSSB/w8DWS182br9HMLl686NPbrB8HZp5NusawsDBMnDiRaYjot5mZmcjPz8f27ds5dE0bxWrVqvE1UK43paecOHECQpRxD1NKEs1xQpTJUHr39bhx40zXF4vFgqFDh2LXrl0oKipiAGiz2bgQjaiFXnzRU4DapEkTrFixArVr15buX///586dYx32hIQE3HHHHdyfdB1mle23qukdHlV241YFKCthKz8489s9k7N3IrDZgN8UCq2obdq0CaWlpdi+fTsGDRqE6tWrGwBg/fr1MW3aNK7M1b+oVLH95ptvltsfJFFHE1NlgUhubi5WrFjBYXQhZEAJeKppSVvaOwH++vXrBh1aITy5UKdOncKGDRuk/vVFTEuFRN4ARl/5uGLFCqn60jvs5A0e9CoblLckhExcfvr0adx7771o0KCBacWszWbDsGHDDJWXYWFh/P2KqmmBsgXD6XSiqKgIy5YtMyTNJyYm8mLkrWOsaRo2bNiA+vXr8/hRFAVxcXHo2bMn7rzzTrRt25b/Rp7YqKgovk4aExTmupFxTBybLpeL1Tz0Ou3e33e73Rg7dixWrFiBjRs3Ys+ePTh27BguXryIkpISbNu2DTk5Obww0fUEBwezR9Nut3Mf0SaEyJ+tViuCg4PL9QrrKWaioqKwdOlSSe9ZT8KtKAoeeeSRSnk9qejK6XSy55vM+3patmzJ8oH5+fmwWq1wu9037P1TVRVNmzaFzWbjIiQhPIUUZnblyhUuKqJGuaiUixsREQG32y3l8FILDAz0eS36FAVfzAXvvPMORwl8zV3Xrl1jxgq3223Y5J09e1baEHvnLr766qucl6mqKrp27SpJNV67dk2iqKI2atQo9uRTrroQnpDxxYsXsXHjRkydOhXt27cvd23w/huxXJB38K677uJr0TSNPbeUlx4SEoLA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# access and visualize the device topology\n", + "print(ionq_device.properties.paradigm.connectivity)\n", + "nx.draw_kamada_kawai(\n", + " ionq_device.topology_graph, with_labels=True, font_color=\"white\", arrows=True, arrowsize=30\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With this information, you can write a circuit to run verbatim on an IonQ device. IonQ currently only supports verbatim compilation for the entire circuit, so every instruction in the circuit will need to be enclosed in a verbatim box. In other words, you cannot have any gates outside of the verbatim box. As well, note that IonQ native gates cannot be used outside of a verbatim box. To learn more about IonQ native gates and the best practice of using them, see the [Amazon Braket Developer Guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html?tag=local002-20#braket-qpu-partner-ionq) and [IonQ's documentation page](https://ionq.com/docs/getting-started-with-native-gates). " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │ 3 │\n", + " ┌───────────┐ ┌──────────────────────┐ \n", + "q0 : ───StartVerbatim───┤ GPi(3.14) ├─┤ MS(0.10, 0.20, 0.30) ├───EndVerbatim───\n", + " ║ └───────────┘ └──────────┬───────────┘ ║ \n", + " ║ ┌──────────┴───────────┐ ║ \n", + "q1 : ─────────╨───────────────────────┤ MS(0.10, 0.20, 0.30) ├────────╨────────\n", + " └──────────────────────┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │\n" + ] + } + ], + "source": [ + "circ = Circuit().gpi(0, pi).ms(0, 1, 0.1, 0.2, 0.3)\n", + "verbatim_circ = Circuit().add_verbatim_box(circ)\n", + "print(verbatim_circ)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({'10': 10})\n" + ] + } + ], + "source": [ + "task = ionq_device.run(verbatim_circ, shots=10)\n", + "print(task.result().measurement_counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Programming verbatim circuits onto the IQM device" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The native gates of IQM Garnet are PRx and CZ. Use these gates in verbatim circuits when submiting to IQM Garnet. " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The native gates for the Garnet device are:\n", + "cz\n", + "prx\n" + ] + } + ], + "source": [ + "# set up the IQM Garnet device\n", + "iqm_device = AwsDevice(Devices.IQM.Garnet)\n", + "\n", + "# list the native gate set\n", + "print(\"The native gates for the\", iqm_device.name, \"device are:\")\n", + "for gate in iqm_device.properties.paradigm.nativeGateSet:\n", + " print(gate)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The native gates need to be programmed on the physical edegs of the device. Let's take a look at the topology of IQM Garnet, shown in the figure below. The topology is a square lattice. The edges are bi-directional where a two-qubit gate can apply on (i,j) and (j,i) where i and j are indices of two qubits. " + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "fullyConnected=False connectivityGraph={'1': ['2', '4'], '10': ['11', '15', '5', '9'], '11': ['12', '16', '6'], '12': ['17', '7'], '13': ['14', '8'], '14': ['15', '18', '9'], '15': ['16', '19'], '16': ['17', '20'], '18': ['19'], '19': ['20'], '2': ['5'], '3': ['4', '8'], '4': ['5', '9'], '5': ['6'], '6': ['7'], '8': ['9']}\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# access and visualize the device topology\n", + "print(iqm_device.properties.paradigm.connectivity)\n", + "\n", + "nx.draw_networkx(\n", + " iqm_device.topology_graph,\n", + " pos={\n", + " 1: (-1, 2),\n", + " 2: (0, 2),\n", + " 3: (-2, 1),\n", + " 4: (-1, 1),\n", + " 5: (0, 1),\n", + " 6: (1, 1),\n", + " 7: (2, 1),\n", + " 8: (-2, 0),\n", + " 9: (-1, 0),\n", + " 10: (0, 0),\n", + " 11: (1, 0),\n", + " 12: (2, 0),\n", + " 13: (-2, -1),\n", + " 14: (-1, -1),\n", + " 15: (0, -1),\n", + " 16: (1, -1),\n", + " 17: (2, -1),\n", + " 18: (-1, -2),\n", + " 19: (0, -2),\n", + " 20: (1, -2),\n", + " },\n", + " arrows=False,\n", + " with_labels=True,\n", + " font_color=\"white\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's compose a verbatim circuit to IQM Garnet. The circuit below creates a Bell state. With verbatim compilation, you have control in preparing a quantum state. There is no gate optimization and you can experiment with different ways to create the quantum state." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │\n", + " ┌──────────────┐ \n", + "q1 : ───StartVerbatim───┤ PRx(1.57, 0) ├───●───────────────────────EndVerbatim───\n", + " ║ └──────────────┘ │ ║ \n", + " ║ ┌──────────────┐ ┌─┴─┐ ┌───────────────┐ ║ \n", + "q2 : ─────────╨─────────┤ PRx(1.57, 0) ├─┤ Z ├─┤ PRx(-1.57, 0) ├────────╨────────\n", + " └──────────────┘ └───┘ └───────────────┘ \n", + "T : │ 0 │ 1 │ 2 │ 3 │ 4 │\n" + ] + } + ], + "source": [ + "circ = Circuit().prx(1, pi / 2, 0).prx(2, pi / 2, 0).cz(1, 2).prx(2, -pi * 0.5, 0)\n", + "verbatim_circ = Circuit().add_verbatim_box(circ)\n", + "print(verbatim_circ)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion \n", + "This notebook introduced the basic functionality of verbatim compilation of Amazon Braket, that allows you to run circuits or subcircuits to be executed exactly as defined without any compiler modifications. You can find further information in the [Amazon Braket documentation](https://docs.aws.amazon.com/braket/). " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum Task Summary\n", + "{<_Rigetti.Ankaa2: 'arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-2'>: {'shots': 5000, 'tasks': {'COMPLETED': 5}}, <_IonQ.Aria1: 'arn:aws:braket:us-east-1::device/qpu/ionq/Aria-1'>: {'shots': 10, 'tasks': {'COMPLETED': 1}}}\n", + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run this example: 6.600 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(t.quantum_tasks_statistics())\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" + ] + } + ], + "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.10" + }, + "vscode": { + "interpreter": { + "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/braket_features/phase_estimation.py b/examples/braket_features/phase_estimation.py index c8410f63a..b3e193ccf 100644 --- a/examples/braket_features/phase_estimation.py +++ b/examples/braket_features/phase_estimation.py @@ -1,4 +1,5 @@ import numpy as np + from braket.circuits import Circuit diff --git a/examples/braket_features/utils_qaoa.py b/examples/braket_features/utils_qaoa.py index 52612c73e..584b586d1 100644 --- a/examples/braket_features/utils_qaoa.py +++ b/examples/braket_features/utils_qaoa.py @@ -1,8 +1,9 @@ # IMPORTS import numpy as np -from braket.circuits import Circuit, circuit, FreeParameter, observables, QubitSet from scipy.optimize import minimize +from braket.circuits import Circuit, FreeParameter, circuit, observables + # function to implement evolution with driver Hamiltonian @circuit.subroutine(register=True) @@ -20,6 +21,7 @@ def driver(beta, n_qubits): return circ + # helper function for evolution with cost Hamiltonian @circuit.subroutine(register=True) def cost_circuit(gammas, n_qubits, ising, device): @@ -34,7 +36,7 @@ def cost_circuit(gammas, n_qubits, ising, device): edges = list(zip(idx[0], idx[1])) # apply ZZ gate for every edge (with corresponding interaction strength) - for (ii, qubit_pair) in enumerate(edges): + for ii, qubit_pair in enumerate(edges): circ.zz(qubit_pair[0], qubit_pair[1], angle=gammas[ii]) return circ @@ -62,6 +64,7 @@ def circuit(params, device, n_qubits, ising): circ.driver(betas[mm], n_qubits) return circ + def cost_h(ising): idx = ising.nonzero() edges = list(zip(idx[0], idx[1])) @@ -74,34 +77,37 @@ def cost_h(ising): start, end = edges[0] return sum(h, 2 * ising[start, end] * observables.Z(start) @ observables.Z(end)) + def form_inputs_dict(params, ising): n_params = len(params) params_dict = {} idx = ising.nonzero() edges = list(zip(idx[0], idx[1])) - split = int(n_params/2) + split = int(n_params / 2) for i in range(split): - params_dict[f'beta_{i}'] = 2 * params[split + i] + params_dict[f"beta_{i}"] = 2 * params[split + i] for j in range(len(edges)): - params_dict[f'gamma_{i}_{j}'] = 2 * ising[edges[j][0], edges[j][1]] * params[i] - + params_dict[f"gamma_{i}_{j}"] = 2 * ising[edges[j][0], edges[j][1]] * params[i] + return params_dict + def form_jacobian(n_params, gradient, ising): # fix jacobian jac = [0.0] * n_params idx = ising.nonzero() edges = list(zip(idx[0], idx[1])) - split = int(n_params/2) + split = int(n_params / 2) for i in range(split): # handle betas - jac[split + i] += 2 * gradient[f'beta_{i}'] + jac[split + i] += 2 * gradient[f"beta_{i}"] # handle gammas for j in range(len(edges)): - jac[i] += 2 * ising[edges[j][0], edges[j][1]] * gradient[f'gamma_{i}_{j}'] - + jac[i] += 2 * ising[edges[j][0], edges[j][1]] * gradient[f"gamma_{i}_{j}"] + return jac + # function that computes cost function for given params def objective_function(params, qaoa_circuit, ising, device, tracker, verbose): """ @@ -118,20 +124,17 @@ def objective_function(params, qaoa_circuit, ising, device, tracker, verbose): # classically simulate the circuit # set the parameter values using the inputs argument # execute the correct device.run call depending on whether the backend is local or cloud based - task = device.run( - qaoa_circuit(**params_dict), shots=0, poll_timeout_seconds=3 * 24 * 60 * 60 - ) + task = device.run(qaoa_circuit(**params_dict), shots=0, poll_timeout_seconds=3 * 24 * 60 * 60) # get result for this task result = task.result() energy = 0.0 idx = ising.nonzero() edges = list(zip(idx[0], idx[1])) - for (term, edge) in zip(result.values, edges): - energy += 2*ising[edge[0], edge[1]]*term - + for term, edge in zip(result.values, edges): + energy += 2 * ising[edge[0], edge[1]] * term + # get metadata - metadata = result.task_metadata tracker["opt_energies"].append(energy) @@ -152,10 +155,9 @@ def objective_function(params, qaoa_circuit, ising, device, tracker, verbose): return energy + # The function to execute the training: run classical minimization. -def train( - device, options, p, ising, n_qubits, opt_method, tracker, params0, verbose=True -): +def train(device, options, p, ising, n_qubits, opt_method, tracker, params0, verbose=True): """ function to run QAOA algorithm for given ising matrix, fixed circuit depth p """ @@ -177,8 +179,10 @@ def train( bnds = bnds_gamma + bnds_beta tracker["params"].append(params0) - - gamma_params = [[FreeParameter(f"gamma_{i}_{j}") for j in range(len(ising.nonzero()[0]))] for i in range(p)] + + gamma_params = [ + [FreeParameter(f"gamma_{i}_{j}") for j in range(len(ising.nonzero()[0]))] for i in range(p) + ] beta_params = [FreeParameter(f"beta_{i}") for i in range(p)] params = gamma_params + beta_params qaoa_circ = circuit(params, device, n_qubits, ising) @@ -186,8 +190,8 @@ def train( h = cost_h(ising) for term in h.summands: qaoa_circ.expectation(observable=term._unscaled()) - - print('Initial energy: ', objective_function(params0, qaoa_circ, ising, device, tracker, False)) + + print("Initial energy: ", objective_function(params0, qaoa_circ, ising, device, tracker, False)) # run classical optimization (example: method='Nelder-Mead') result = minimize( objective_function, @@ -209,6 +213,7 @@ def train( return result_energy, result_angle, tracker + # function that computes cost function and gradient for given params def objective_function_adjoint(params, qaoa_circuit, ising, device, tracker, verbose): """ @@ -221,7 +226,7 @@ def objective_function_adjoint(params, qaoa_circuit, ising, device, tracker, ver print("Calling the quantum circuit. Cycle:", tracker["count"]) # create parameter dict - params_dict = form_inputs_dict(params, ising) + params_dict = form_inputs_dict(params, ising) # classically simulate the circuit # set the parameter values using the inputs argument # execute the correct device.run call depending on whether the backend is local or cloud based @@ -232,13 +237,12 @@ def objective_function_adjoint(params, qaoa_circuit, ising, device, tracker, ver # get result for this task result = task.result() gradient = result.values[0] - energy = gradient['expectation'] + energy = gradient["expectation"] # get metadata - metadata = result.task_metadata tracker["opt_energies"].append(energy) - # store optimal energy + # store optimal energy if energy < tracker["optimal_energy"]: tracker.update({"optimal_energy": energy}) @@ -257,9 +261,7 @@ def objective_function_adjoint(params, qaoa_circuit, ising, device, tracker, ver # The function to execute the training: run classical minimization. -def train_adjoint( - device, options, p, ising, n_qubits, opt_method, tracker, params0, verbose=True -): +def train_adjoint(device, options, p, ising, n_qubits, opt_method, tracker, params0, verbose=True): """ function to run QAOA algorithm for given, fixed circuit depth p """ @@ -281,21 +283,26 @@ def train_adjoint( bnds = bnds_gamma + bnds_beta tracker["params"].append(params0) - - gamma_params = [[FreeParameter(f"gamma_{i}_{j}") for j in range(len(ising.nonzero()[0]))] for i in range(p)] + + gamma_params = [ + [FreeParameter(f"gamma_{i}_{j}") for j in range(len(ising.nonzero()[0]))] for i in range(p) + ] beta_params = [FreeParameter(f"beta_{i}") for i in range(p)] params = gamma_params + beta_params qaoa_circ = circuit(params, device, n_qubits, ising) - + h = cost_h(ising) qaoa_circ.adjoint_gradient(observable=h, parameters=[]) - - print('Initial energy: ', objective_function_adjoint(params0, qaoa_circ, ising, device, tracker, False)[0]) + + print( + "Initial energy: ", + objective_function_adjoint(params0, qaoa_circ, ising, device, tracker, False)[0], + ) # run classical optimization (example: method='Nelder-Mead') result = minimize( objective_function_adjoint, params0, - jac=True, # objective function will return both f and its jacobian + jac=True, # objective function will return both f and its jacobian args=(qaoa_circ, ising, device, tracker, verbose), options=options, method=opt_method, diff --git a/examples/getting_started/0_Getting_started/0_Getting_started.ipynb b/examples/getting_started/0_Getting_started/0_Getting_started.ipynb index 4cbf31a12..e71541b76 100644 --- a/examples/getting_started/0_Getting_started/0_Getting_started.ipynb +++ b/examples/getting_started/0_Getting_started/0_Getting_started.ipynb @@ -22,6 +22,7 @@ "source": [ "# general imports\n", "import matplotlib.pyplot as plt\n", + "\n", "%matplotlib inline\n", "\n", "# AWS imports: Import Braket SDK modules\n", @@ -115,9 +116,9 @@ ], "source": [ "# plot using Counter\n", - "plt.bar(counts.keys(), counts.values());\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('counts');" + "plt.bar(counts.keys(), counts.values())\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\");" ] } ], diff --git a/examples/getting_started/1_Running_quantum_circuits_on_simulators/1_Running_quantum_circuits_on_simulators.ipynb b/examples/getting_started/1_Running_quantum_circuits_on_simulators/1_Running_quantum_circuits_on_simulators.ipynb index a20aeb861..0bc836054 100644 --- a/examples/getting_started/1_Running_quantum_circuits_on_simulators/1_Running_quantum_circuits_on_simulators.ipynb +++ b/examples/getting_started/1_Running_quantum_circuits_on_simulators/1_Running_quantum_circuits_on_simulators.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -45,15 +46,17 @@ "source": [ "# general imports\n", "import matplotlib.pyplot as plt\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline\n", "import numpy as np\n", "\n", + "from braket.aws import AwsDevice\n", + "\n", "# AWS imports: Import Braket SDK modules\n", "from braket.circuits import Circuit\n", "from braket.circuits.observables import Z\n", - "from braket.devices import Devices, LocalSimulator\n", - "from braket.aws import AwsDevice" + "from braket.devices import Devices, LocalSimulator" ] }, { @@ -117,13 +120,13 @@ "\n", " # instantiate circuit object\n", " circuit = Circuit()\n", - " \n", + "\n", " # add Hadamard gate on first qubit\n", " circuit.h(0)\n", "\n", " # apply series of CNOT gates\n", - " for ii in range(0, n_qubits-1):\n", - " circuit.cnot(control=ii, target=ii+1)\n", + " for ii in range(0, n_qubits - 1):\n", + " circuit.cnot(control=ii, target=ii + 1)\n", "\n", " return circuit" ] @@ -288,8 +291,8 @@ "source": [ "# plot using Counter\n", "plt.bar(counts.keys(), counts.values())\n", - "plt.xlabel('bitstrings')\n", - "plt.ylabel('counts')" + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\")" ] }, { @@ -339,7 +342,7 @@ "source": [ "# define circuit\n", "n_qubits = 3\n", - "ghz = ghz_circuit(n_qubits) \n", + "ghz = ghz_circuit(n_qubits)\n", "\n", "# add the state_vector ResultType\n", "ghz.state_vector()\n", @@ -501,13 +504,13 @@ "\n", "# plot using Counter\n", "plt.bar(counts.keys(), counts.values())\n", - "plt.xlabel('bitstrings')\n", - "plt.ylabel('counts')\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\")\n", "\n", "# print counts of all-zero-string\n", - "print('Counts for all-zero bitstring:', counts['0'*n_qubits])\n", + "print(\"Counts for all-zero bitstring:\", counts[\"0\" * n_qubits])\n", "# print counts of all-one-string\n", - "print('Counts for all-one bitstring:', counts['1'*n_qubits])" + "print(\"Counts for all-one bitstring:\", counts[\"1\" * n_qubits])" ] }, { @@ -563,9 +566,9 @@ "print(counts)\n", "\n", "# print counts of all-zero-string\n", - "print('Counts for all-zero bitstring:', counts['0'*n_qubits])\n", + "print(\"Counts for all-zero bitstring:\", counts[\"0\" * n_qubits])\n", "# print counts of all-one-string\n", - "print('Counts for all-one bitstring:', counts['1'*n_qubits])" + "print(\"Counts for all-one bitstring:\", counts[\"1\" * n_qubits])" ] }, { @@ -599,7 +602,7 @@ "# recover other metadata information such as number of qubits\n", "n = result.task_metadata.deviceParameters.paradigmParameters.qubitCount\n", "# print('Task ID:', task_id)\n", - "print('Number of qubits:', n)" + "print(\"Number of qubits:\", n)" ] }, { @@ -626,8 +629,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] } ], diff --git a/examples/getting_started/2_Running_quantum_circuits_on_QPU_devices/2_Running_quantum_circuits_on_QPU_devices.ipynb b/examples/getting_started/2_Running_quantum_circuits_on_QPU_devices/2_Running_quantum_circuits_on_QPU_devices.ipynb index f816e778e..80c690bad 100644 --- a/examples/getting_started/2_Running_quantum_circuits_on_QPU_devices/2_Running_quantum_circuits_on_QPU_devices.ipynb +++ b/examples/getting_started/2_Running_quantum_circuits_on_QPU_devices/2_Running_quantum_circuits_on_QPU_devices.ipynb @@ -15,6 +15,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -33,10 +34,10 @@ "source": [ "# general imports\n", "import matplotlib.pyplot as plt\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline\n", "import string\n", - "import time\n", "\n", "# AWS imports: Import Braket SDK modules\n", "from braket.aws import AwsDevice, AwsQuantumTask\n", @@ -92,28 +93,28 @@ "source": [ "# print all (the usual suspects) available gates currently available within SDK\n", "gate_set = [attr for attr in dir(Gate) if attr[0] in string.ascii_uppercase]\n", - "print('Gate set supported by SDK:\\n', gate_set)\n", - "print('\\n') \n", + "print(\"Gate set supported by SDK:\\n\", gate_set)\n", + "print(\"\\n\")\n", "\n", "# the Rigetti device\n", "rigetti = AwsDevice(Devices.Rigetti.Ankaa2)\n", "supported_gates = rigetti.properties.action[DeviceActionType.OPENQASM].supportedOperations\n", "# print the supported gate set\n", - "print('Gate set supported by the Rigetti Ankaa-2 device:\\n', supported_gates)\n", - "print('\\n') \n", + "print(\"Gate set supported by the Rigetti Ankaa-2 device:\\n\", supported_gates)\n", + "print(\"\\n\")\n", "\n", "# the IonQ device\n", "ionq = AwsDevice(Devices.IonQ.Aria1)\n", "supported_gates = ionq.properties.action[DeviceActionType.OPENQASM].supportedOperations\n", "# print the supported gate set\n", - "print('Gate set supported by the IonQ Aria 1 device:\\n', supported_gates)\n", - "print('\\n')\n", + "print(\"Gate set supported by the IonQ Aria 1 device:\\n\", supported_gates)\n", + "print(\"\\n\")\n", "\n", "# the IQM Garnet device\n", "iqm = AwsDevice(Devices.IQM.Garnet)\n", "supported_gates = iqm.properties.action[DeviceActionType.OPENQASM].supportedOperations\n", "# print the supported gate set\n", - "print('Gate set supported by the IQM Garnet device:\\n', supported_gates)\n" + "print(\"Gate set supported by the IQM Garnet device:\\n\", supported_gates)" ] }, { @@ -274,8 +275,8 @@ "source": [ "# plot using Counter\n", "plt.bar(counts.keys(), counts.values())\n", - "plt.xlabel('bitstrings')\n", - "plt.ylabel('counts')" + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\")" ] }, { @@ -343,19 +344,19 @@ ], "source": [ "# create a clean circuit with no result type attached.(This is because some result types are only supported when shots=0)\n", - "bell = Circuit().h(0).cnot(0, 1) \n", + "bell = Circuit().h(0).cnot(0, 1)\n", "\n", "# add the Z \\otimes Z expectation value\n", "bell.expectation(observables.Z(0) @ observables.Z(1))\n", "\n", - "# run circuit \n", + "# run circuit\n", "rigetti_task = rigetti.run(bell, shots=1000)\n", "\n", "# get id and status of submitted task\n", "rigetti_task_id = rigetti_task.id\n", "rigetti_status = rigetti_task.state()\n", "# print('ID of task:', rigetti_task_id)\n", - "print('Status of quantum task:', rigetti_status)" + "print(\"Status of quantum task:\", rigetti_status)" ] }, { @@ -417,7 +418,7 @@ "source": [ "# print status\n", "status = rigetti_task.state()\n", - "print('Status of (reconstructed) quantum task:', status)" + "print(\"Status of (reconstructed) quantum task:\", status)" ] }, { @@ -490,7 +491,7 @@ "ionq_task_id = ionq_task.id\n", "ionq_status = ionq_task.state()\n", "# print('ID of quantum task:', ionq_task_id)\n", - "print('Status of quantum task:', ionq_status)" + "print(\"Status of quantum task:\", ionq_status)" ] }, { @@ -537,7 +538,7 @@ "source": [ "# print status\n", "status = ionq_task.state()\n", - "print('Status of (reconstructed) quantum task:', status)" + "print(\"Status of (reconstructed) quantum task:\", status)" ] }, { @@ -569,7 +570,7 @@ "iqm_task_id = iqm_task.id\n", "iqm_status = iqm_task.state()\n", "# print('ID of quantum task:', iqm_task_id)\n", - "print('Status of quantum task:', iqm_status)" + "print(\"Status of quantum task:\", iqm_status)" ] }, { @@ -629,7 +630,7 @@ "pc_task = rigetti.run(parametrized_circuit, shots=100, inputs={\"theta\": angle_value})\n", "\n", "# get status of submitted quantum task\n", - "print('Status of quantum task:', pc_task.state())" + "print(\"Status of quantum task:\", pc_task.state())" ] }, { @@ -704,44 +705,47 @@ "\n", "# print status\n", "status = task_load.state()\n", - "print('Status of (reconstructed) quantum task:', status)\n", - "print('\\n')\n", + "print(\"Status of (reconstructed) quantum task:\", status)\n", + "print(\"\\n\")\n", "# wait for job to complete\n", "# terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", - "if status == 'COMPLETED':\n", + "if status == \"COMPLETED\":\n", " # get results\n", " rigetti_results = task_load.result()\n", " # print(rigetti_results)\n", - " \n", + "\n", " # get all metadata of submitted quantum task\n", " metadata = task_load.metadata()\n", " # example for metadata\n", - " shots = metadata['shots']\n", - " machine = metadata['deviceArn']\n", + " shots = metadata[\"shots\"]\n", + " machine = metadata[\"deviceArn\"]\n", " # print example metadata\n", " print(\"{} shots taken on machine {}.\\n\".format(shots, machine))\n", - " \n", + "\n", " # get the compiled circuit\n", - " print(\"The compiled circuit is:\\n\", rigetti_results.additional_metadata.rigettiMetadata.compiledProgram)\n", - " \n", + " print(\n", + " \"The compiled circuit is:\\n\",\n", + " rigetti_results.additional_metadata.rigettiMetadata.compiledProgram,\n", + " )\n", + "\n", " # get measurement counts\n", " rigetti_counts = rigetti_results.measurement_counts\n", - " print('Measurement counts:', rigetti_counts)\n", + " print(\"Measurement counts:\", rigetti_counts)\n", "\n", " # plot results: see effects of noise\n", " plt.bar(rigetti_counts.keys(), rigetti_counts.values())\n", - " plt.xlabel('bitstrings')\n", - " plt.ylabel('counts')\n", + " plt.xlabel(\"bitstrings\")\n", + " plt.ylabel(\"counts\")\n", " plt.tight_layout()\n", - " plt.savefig('rigetti.png', dpi=700)\n", - " \n", - "elif status in ['FAILED', 'CANCELLED']:\n", - " # print terminal message \n", - " print('Your quantum task is in terminal status, but has not completed.')\n", + " plt.savefig(\"rigetti.png\", dpi=700)\n", + "\n", + "elif status in [\"FAILED\", \"CANCELLED\"]:\n", + " # print terminal message\n", + " print(\"Your quantum task is in terminal status, but has not completed.\")\n", "\n", "else:\n", " # print current status\n", - " print('Sorry, your quantum task is still being processed and has not been finalized yet.')" + " print(\"Sorry, your quantum task is still being processed and has not been finalized yet.\")" ] }, { @@ -764,41 +768,41 @@ "\n", "# print status\n", "status = task_load.state()\n", - "print('Status of (reconstructed) quantum task:', status)\n", + "print(\"Status of (reconstructed) quantum task:\", status)\n", "\n", "# wait for job to complete\n", "# terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", - "if status == 'COMPLETED':\n", + "if status == \"COMPLETED\":\n", " # get results\n", " results = task_load.result()\n", " # print(rigetti_results)\n", - " \n", + "\n", " # get all metadata of submitted quantum task\n", " metadata = task_load.metadata()\n", " # example for metadata\n", - " shots = metadata['shots']\n", - " machine = metadata['deviceArn']\n", + " shots = metadata[\"shots\"]\n", + " machine = metadata[\"deviceArn\"]\n", " # print example metadata\n", " print(\"{} shots taken on machine {}.\".format(shots, machine))\n", - " \n", + "\n", " # get measurement counts\n", " counts = results.measurement_counts\n", - " print('Measurement counts:', counts)\n", + " print(\"Measurement counts:\", counts)\n", "\n", " # plot results: see effects of noise\n", " plt.bar(counts.keys(), counts.values())\n", - " plt.xlabel('bitstrings')\n", - " plt.ylabel('counts')\n", + " plt.xlabel(\"bitstrings\")\n", + " plt.ylabel(\"counts\")\n", " plt.tight_layout()\n", - " plt.savefig('bell_ionq.png', dpi=700)\n", - " \n", - "elif status in ['FAILED', 'CANCELLED']:\n", - " # print terminal message \n", - " print('Your quantum task is in terminal status, but has not completed.')\n", + " plt.savefig(\"bell_ionq.png\", dpi=700)\n", + "\n", + "elif status in [\"FAILED\", \"CANCELLED\"]:\n", + " # print terminal message\n", + " print(\"Your quantum task is in terminal status, but has not completed.\")\n", "\n", "else:\n", " # print current status\n", - " print('Sorry, your quantum task is still being processed and has not been finalized yet.')" + " print(\"Sorry, your quantum task is still being processed and has not been finalized yet.\")" ] }, { @@ -869,20 +873,20 @@ "\n", "# run circuit\n", "task = rigetti.run(bell, shots=1000)\n", - "print('Information on quantum task:\\n', task)\n", - "print('==================================' * 2)\n", + "print(\"Information on quantum task:\\n\", task)\n", + "print(\"==================================\" * 2)\n", "\n", "# get status of submitted quantum task\n", "status = task.state()\n", "\n", "# wait for job to complete\n", - "terminal_states = ['COMPLETED', 'FAILED', 'CANCELLED']\n", + "terminal_states = [\"COMPLETED\", \"FAILED\", \"CANCELLED\"]\n", "while status not in terminal_states:\n", " status = task.state()\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", " # time.sleep(60)\n", "\n", - "print('Status:', status)\n", + "print(\"Status:\", status)\n", "\n", "# get results\n", "rigetti_results = task.result()\n", @@ -894,10 +898,10 @@ "\n", "# plot results: see effects of noise\n", "plt.bar(rigetti_counts.keys(), rigetti_counts.values())\n", - "plt.xlabel('bitstrings')\n", - "plt.ylabel('counts')\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\")\n", "plt.tight_layout()\n", - "plt.savefig('rigetti2.png', dpi=700)" + "plt.savefig(\"rigetti2.png\", dpi=700)" ] }, { @@ -919,8 +923,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] }, { diff --git a/examples/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits.ipynb b/examples/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits.ipynb index 168240907..eda33e2ec 100644 --- a/examples/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits.ipynb +++ b/examples/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -57,13 +58,15 @@ "source": [ "# general imports\n", "import asyncio\n", - "import numpy as np\n", + "\n", "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline\n", + "import logging\n", "import string\n", "from datetime import datetime\n", - "import logging\n", "\n", "# AWS imports: Import Braket SDK modules\n", "from braket.aws import AwsDevice, AwsQuantumTask\n", @@ -230,8 +233,10 @@ } ], "source": [ - "# define circuit with some parametrized gates \n", - "my_circuit = Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x([1,3])\n", + "# define circuit with some parametrized gates\n", + "my_circuit = (\n", + " Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x([1, 3])\n", + ")\n", "print(my_circuit)" ] }, @@ -277,10 +282,19 @@ ], "source": [ "# define circuit with some parametrized gates and free parameters\n", - "alpha = FreeParameter('alpha')\n", - "beta = FreeParameter('beta')\n", - "gamma = FreeParameter('gamma')\n", - "my_circuit = Circuit().rx(0, alpha).ry(1, beta).rz(2, gamma).h(3).cnot(control=0, target=2).cnot(1, 3).x([1,3])\n", + "alpha = FreeParameter(\"alpha\")\n", + "beta = FreeParameter(\"beta\")\n", + "gamma = FreeParameter(\"gamma\")\n", + "my_circuit = (\n", + " Circuit()\n", + " .rx(0, alpha)\n", + " .ry(1, beta)\n", + " .rz(2, gamma)\n", + " .h(3)\n", + " .cnot(control=0, target=2)\n", + " .cnot(1, 3)\n", + " .x([1, 3])\n", + ")\n", "print(my_circuit)" ] }, @@ -326,7 +340,7 @@ }, "outputs": [], "source": [ - "# helper function to build custom gate \n", + "# helper function to build custom gate\n", "def u3(alpha, theta, phi):\n", " \"\"\"\n", " function to return matrix for general single qubit rotation\n", @@ -334,11 +348,11 @@ " and n defines rotation axis as n=(sin(theta)cos(phi), sin(theta)sin(phi), cos(theta))\n", " sigma is vector of Pauli matrices\n", " \"\"\"\n", - " u11 = np.cos(alpha/2)-1j*np.sin(alpha/2)*np.cos(theta)\n", - " u12 = -1j*(np.exp(-1j*phi))*np.sin(theta)*np.sin(alpha/2)\n", - " u21 = -1j*(np.exp(1j*phi))*np.sin(theta)*np.sin(alpha/2)\n", - " u22 = np.cos(alpha/2)+1j*np.sin(alpha/2)*np.cos(theta)\n", - " \n", + " u11 = np.cos(alpha / 2) - 1j * np.sin(alpha / 2) * np.cos(theta)\n", + " u12 = -1j * (np.exp(-1j * phi)) * np.sin(theta) * np.sin(alpha / 2)\n", + " u21 = -1j * (np.exp(1j * phi)) * np.sin(theta) * np.sin(alpha / 2)\n", + " u22 = np.cos(alpha / 2) + 1j * np.sin(alpha / 2) * np.cos(theta)\n", + "\n", " return np.array([[u11, u12], [u21, u22]])" ] }, @@ -369,7 +383,7 @@ ], "source": [ "# define and print custom unitary\n", - "my_u3 = u3(np.pi/2, 0, 0)\n", + "my_u3 = u3(np.pi / 2, 0, 0)\n", "# print(my_u3)\n", "# define example circuit applying custom U to the first qubit\n", "circ = Circuit().unitary(matrix=my_u3, targets=[0]).h(1).cnot(control=0, target=1)\n", @@ -404,26 +418,26 @@ " n defines the rotation axis via n=(sin(theta)cos(phi), sin(theta)sin(phi), cos(theta)),\n", " and sigma is the vector of Pauli matrices\n", " \"\"\"\n", - " \n", + "\n", " # get angles\n", " alpha = angles[0]\n", " theta = angles[1]\n", " phi = angles[2]\n", - " \n", + "\n", " # set 2x2 matrix entries\n", - " u11 = np.cos(alpha/2)-1j*np.sin(alpha/2)*np.cos(theta)\n", - " u12 = -1j*(np.exp(-1j*phi))*np.sin(theta)*np.sin(alpha/2)\n", - " u21 = -1j*(np.exp(1j*phi))*np.sin(theta)*np.sin(alpha/2)\n", - " u22 = np.cos(alpha/2)+1j*np.sin(alpha/2)*np.cos(theta)\n", - " \n", + " u11 = np.cos(alpha / 2) - 1j * np.sin(alpha / 2) * np.cos(theta)\n", + " u12 = -1j * (np.exp(-1j * phi)) * np.sin(theta) * np.sin(alpha / 2)\n", + " u21 = -1j * (np.exp(1j * phi)) * np.sin(theta) * np.sin(alpha / 2)\n", + " u22 = np.cos(alpha / 2) + 1j * np.sin(alpha / 2) * np.cos(theta)\n", + "\n", " # define unitary as numpy matrix\n", " u = np.array([[u11, u12], [u21, u22]])\n", " # print('Unitary:', u)\n", - " \n", + "\n", " # define custom Braket gate\n", " circ = Circuit()\n", " circ.unitary(matrix=u, targets=target)\n", - " \n", + "\n", " return circ" ] }, @@ -454,8 +468,8 @@ ], "source": [ "# define example circuit applying custom single-qubit gate U to the first qubit\n", - "angles = [np.pi/2, np.pi/2, np.pi/2]\n", - "angles = [np.pi/4, 0, 0]\n", + "angles = [np.pi / 2, np.pi / 2, np.pi / 2]\n", + "angles = [np.pi / 4, 0, 0]\n", "\n", "# build circuit using custom u3 gate\n", "circ2 = Circuit().u3([0], angles).cnot(control=0, target=1)\n", @@ -510,12 +524,14 @@ } ], "source": [ - "# define circuit with parametrized gates \n", - "my_circuit = Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x(0)\n", + "# define circuit with parametrized gates\n", + "my_circuit = (\n", + " Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x(0)\n", + ")\n", "circuit_depth = my_circuit.depth\n", "print(my_circuit)\n", "print()\n", - "print('Total circuit depth:', circuit_depth)" + "print(\"Total circuit depth:\", circuit_depth)" ] }, { @@ -564,21 +580,23 @@ } ], "source": [ - "# define circuit with parameterized gates \n", - "my_circuit = Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x(4)\n", + "# define circuit with parameterized gates\n", + "my_circuit = (\n", + " Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x(4)\n", + ")\n", "# get circuit depth\n", "circuit_depth = my_circuit.depth\n", "# get qubit number\n", "qubit_count = my_circuit.qubit_count\n", "# get approx. estimate of circuit size\n", - "circuit_size = circuit_depth*qubit_count\n", + "circuit_size = circuit_depth * qubit_count\n", "# print circuit\n", "print(my_circuit)\n", "print()\n", "# print characteristics of our circuit\n", - "print('Total circuit depth:', circuit_depth)\n", - "print('Number of qubits:', qubit_count)\n", - "print('Circuit size:', circuit_size)" + "print(\"Total circuit depth:\", circuit_depth)\n", + "print(\"Number of qubits:\", qubit_count)\n", + "print(\"Circuit size:\", circuit_size)" ] }, { @@ -648,13 +666,13 @@ "# get qubit number\n", "qubit_count = my_circuit.qubit_count\n", "# get circuit size\n", - "circuit_size = circuit_depth*qubit_count\n", + "circuit_size = circuit_depth * qubit_count\n", "# print circuit\n", "print(my_circuit)\n", "print()\n", - "print('Total circuit depth:', circuit_depth)\n", - "print('Number of qubits:', qubit_count)\n", - "print('Circuit size:', circuit_size)" + "print(\"Total circuit depth:\", circuit_depth)\n", + "print(\"Number of qubits:\", qubit_count)\n", + "print(\"Circuit size:\", circuit_size)" ] }, { @@ -710,13 +728,13 @@ "# get qubit number\n", "qubit_count = my_circuit.qubit_count\n", "# get circuit size\n", - "circuit_size = circuit_depth*qubit_count\n", + "circuit_size = circuit_depth * qubit_count\n", "# print circuit\n", "print(my_circuit)\n", "print()\n", - "print('Total circuit depth:', circuit_depth)\n", - "print('Number of qubits:', qubit_count)\n", - "print('Circuit size:', circuit_size)" + "print(\"Total circuit depth:\", circuit_depth)\n", + "print(\"Number of qubits:\", qubit_count)\n", + "print(\"Circuit size:\", circuit_size)" ] }, { @@ -774,14 +792,14 @@ "# get qubit number\n", "qubit_count = my_circuit.qubit_count\n", "# get circuit size\n", - "circuit_size = circuit_depth*qubit_count\n", + "circuit_size = circuit_depth * qubit_count\n", "# print circuit\n", "print(my_circuit)\n", "print()\n", "# print characteristics of our circuit\n", - "print('Total circuit depth:', circuit_depth)\n", - "print('Number of qubits:', qubit_count)\n", - "print('Circuit size:', circuit_size)" + "print(\"Total circuit depth:\", circuit_depth)\n", + "print(\"Number of qubits:\", qubit_count)\n", + "print(\"Circuit size:\", circuit_size)" ] }, { @@ -863,9 +881,11 @@ "# show the properties of the device\n", "device_properties = device.properties\n", "# show supportedQuantumOperations (supported gates for a device)\n", - "device_operations = device_properties.dict()['action']['braket.ir.jaqcd.program']['supportedOperations']\n", + "device_operations = device_properties.dict()[\"action\"][\"braket.ir.jaqcd.program\"][\n", + " \"supportedOperations\"\n", + "]\n", "# Note: This field also exists for other devices like the QPUs\n", - "print('Quantum Gates supported by this device:\\n',device_operations)" + "print(\"Quantum Gates supported by this device:\\n\", device_operations)" ] }, { @@ -923,20 +943,18 @@ ], "source": [ "# define quantum task (asynchronous)\n", - "task = device.run(my_circuit, \n", - " poll_timeout_seconds = 100, \n", - " shots=1000)\n", + "task = device.run(my_circuit, poll_timeout_seconds=100, shots=1000)\n", "\n", "# get id and status of submitted quantum task\n", "task_id = task.id\n", "status = task.state()\n", "# print('ID of quantum task:', task_id)\n", - "print('Status of quantum task:', status)\n", + "print(\"Status of quantum task:\", status)\n", "\n", "# wait for job to complete\n", - "while status != 'COMPLETED':\n", + "while status != \"COMPLETED\":\n", " status = task.state()\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", "\n", "# get results of quantum task\n", "result = task.result()\n", @@ -948,9 +966,9 @@ "print(counts)\n", "\n", "# plot using Counter\n", - "plt.bar(counts.keys(), counts.values());\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('counts');" + "plt.bar(counts.keys(), counts.values())\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\");" ] }, { @@ -1022,26 +1040,38 @@ ], "source": [ "# define circuit with some parametrized gates and free parameters\n", - "alpha = FreeParameter('alpha')\n", - "beta = FreeParameter('beta')\n", - "gamma = FreeParameter('gamma')\n", - "my_circuit = Circuit().rx(0, alpha).ry(1, beta).rz(2, gamma).h(3).cnot(control=0, target=2).cnot(1, 3).x([1,3])\n", + "alpha = FreeParameter(\"alpha\")\n", + "beta = FreeParameter(\"beta\")\n", + "gamma = FreeParameter(\"gamma\")\n", + "my_circuit = (\n", + " Circuit()\n", + " .rx(0, alpha)\n", + " .ry(1, beta)\n", + " .rz(2, gamma)\n", + " .h(3)\n", + " .cnot(control=0, target=2)\n", + " .cnot(1, 3)\n", + " .x([1, 3])\n", + ")\n", "print(my_circuit)\n", "# define quantum task (asynchronous)\n", - "task = device.run(my_circuit, \n", - " poll_timeout_seconds = 100, \n", - " shots=1000, inputs={'alpha': 0.1, 'beta': 0.2, 'gamma': 0.3})\n", + "task = device.run(\n", + " my_circuit,\n", + " poll_timeout_seconds=100,\n", + " shots=1000,\n", + " inputs={\"alpha\": 0.1, \"beta\": 0.2, \"gamma\": 0.3},\n", + ")\n", "\n", "# get id and status of submitted quantum task\n", "task_id = task.id\n", "status = task.state()\n", "# print('ID of quantum task:', task_id)\n", - "print('Status of quantum task:', status)\n", + "print(\"Status of quantum task:\", status)\n", "\n", "# wait for job to complete\n", - "while status != 'COMPLETED':\n", + "while status != \"COMPLETED\":\n", " status = task.state()\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", "\n", "# get results of task\n", "result = task.result()\n", @@ -1053,9 +1083,9 @@ "print(counts)\n", "\n", "# plot using Counter\n", - "plt.bar(counts.keys(), counts.values());\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('counts');" + "plt.bar(counts.keys(), counts.values())\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\");" ] }, { @@ -1087,8 +1117,8 @@ "# get all metadata of submitted quantum task\n", "metadata = task.metadata()\n", "# example for metadata\n", - "shots = metadata['shots']\n", - "date = metadata['ResponseMetadata']['HTTPHeaders']['date']\n", + "shots = metadata[\"shots\"]\n", + "date = metadata[\"ResponseMetadata\"][\"HTTPHeaders\"][\"date\"]\n", "# print example metadata\n", "print(\"{} shots taken on {}.\".format(shots, date))" ] @@ -1123,7 +1153,7 @@ "task_load = AwsQuantumTask(arn=task_id)\n", "# print status\n", "status = task_load.state()\n", - "print('Status of (reconstructed) quantum task:', status)" + "print(\"Status of (reconstructed) quantum task:\", status)" ] }, { @@ -1165,9 +1195,9 @@ "print(counts)\n", "\n", "# plot using Counter\n", - "plt.bar(counts.keys(), counts.values(), color='g');\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('counts');" + "plt.bar(counts.keys(), counts.values(), color=\"g\")\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\");" ] }, { @@ -1198,18 +1228,18 @@ ], "source": [ "# define quantum task\n", - "task = device.run(my_circuit, shots=1000, inputs={'alpha': 0.1, 'beta': 0.2, 'gamma': 0.3})\n", + "task = device.run(my_circuit, shots=1000, inputs={\"alpha\": 0.1, \"beta\": 0.2, \"gamma\": 0.3})\n", "\n", "# get id and status of submitted quantum task\n", "task_id = task.id\n", "status = task.state()\n", "# print('ID of quantum task:', task_id)\n", - "print('Status of quantum task:', status)\n", + "print(\"Status of quantum task:\", status)\n", "\n", - "# cancel task \n", + "# cancel task\n", "task.cancel()\n", "status = task.state()\n", - "print('Status of quantum task:', status)" + "print(\"Status of quantum task:\", status)" ] }, { @@ -1259,7 +1289,7 @@ "# Print the circuit and measured qubits\n", "print(circuit)\n", "print()\n", - "print(\"Measured qubits: \", result.measured_qubits)\n" + "print(\"Measured qubits: \", result.measured_qubits)" ] }, { @@ -1302,9 +1332,9 @@ "print(counts)\n", "\n", "# plot using Counter\n", - "plt.bar(counts.keys(), counts.values(), color='g');\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('counts');" + "plt.bar(counts.keys(), counts.values(), color=\"g\")\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\");" ] }, { @@ -1362,7 +1392,7 @@ "obs = X(0) @ Y(1)\n", "circ.expectation(obs)\n", "# add variance\n", - "circ.variance(obs) \n", + "circ.variance(obs)\n", "# add samples\n", "\n", "circ.sample(obs)\n", @@ -1443,8 +1473,8 @@ "samples = result.values[2]\n", "sum_of_samples = samples.sum()\n", "total_counts = len(samples)\n", - "expect_from_samples = sum_of_samples/total_counts\n", - "print('Expectation value from samples:', expect_from_samples)" + "expect_from_samples = sum_of_samples / total_counts\n", + "print(\"Expectation value from samples:\", expect_from_samples)" ] }, { @@ -1563,17 +1593,17 @@ "# add result types\n", "circ = my_circuit\n", "# add the state_vector ResultType available for shots=0\n", - "circ.state_vector() \n", + "circ.state_vector()\n", "# add single qubit expectation value\n", "obs1 = Y(1) @ X(2)\n", "circ.expectation(obs1)\n", "# add the two-qubit Z0*Z1 expectation value\n", "obs2 = Z(0) @ Z(1)\n", - "circ.expectation(obs2) \n", + "circ.expectation(obs2)\n", "# add the amplitude for |0...0>\n", - "bitstring = '0'*circ.qubit_count\n", - "circ.amplitude(state=[bitstring]) \n", - "# add marginal probability \n", + "bitstring = \"0\" * circ.qubit_count\n", + "circ.amplitude(state=[bitstring])\n", + "# add marginal probability\n", "circ.probability(target=[3])\n", "print(circ)" ] @@ -1619,7 +1649,7 @@ "# set up device\n", "device = LocalSimulator()\n", "# run the circuit and output the results specified above\n", - "task = device.run(circ, shots=0, inputs={'alpha': 0.1, 'beta': 0.2, 'gamma': 0.3})\n", + "task = device.run(circ, shots=0, inputs={\"alpha\": 0.1, \"beta\": 0.2, \"gamma\": 0.3})\n", "result = task.result()\n", "print(\"Final state vector:\\n\", result.values[0])\n", "print(\"Expectation value \", result.values[1])\n", @@ -1662,15 +1692,15 @@ ], "source": [ "# set filename for logs\n", - "log_file = 'device_logs-'+datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')+'.txt'\n", - "print('Quantum task info will be logged in:', log_file)\n", + "log_file = \"device_logs-\" + datetime.strftime(datetime.now(), \"%Y%m%d%H%M%S\") + \".txt\"\n", + "print(\"Quantum task info will be logged in:\", log_file)\n", "\n", "# create new logger object\n", - "logger = logging.getLogger(\"newLogger\") \n", + "logger = logging.getLogger(\"newLogger\")\n", "# configure to log to file device_logs.txt in the appending mode\n", - "logger.addHandler(logging.FileHandler(filename=log_file, mode='a'))\n", + "logger.addHandler(logging.FileHandler(filename=log_file, mode=\"a\"))\n", "# add to file all log messages with level DEBUG or above\n", - "logger.setLevel(logging.DEBUG) " + "logger.setLevel(logging.DEBUG)" ] }, { @@ -1709,15 +1739,19 @@ ], "source": [ "# define circuit\n", - "circ_log = Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x(4)\n", + "circ_log = (\n", + " Circuit().rx(0, 0.15).ry(1, 0.2).rz(2, 0.25).h(3).cnot(control=0, target=2).cnot(1, 3).x(4)\n", + ")\n", "print(circ_log)\n", "# define device\n", "device = AwsDevice(Devices.Amazon.SV1)\n", "# define what info to log\n", "logger.info(\n", - " device.run(circ_log, \n", - " poll_timeout_seconds=1200, poll_interval_seconds=0.25, logger=logger, shots=1000)\n", - " .result().measurement_counts\n", + " device.run(\n", + " circ_log, poll_timeout_seconds=1200, poll_interval_seconds=0.25, logger=logger, shots=1000\n", + " )\n", + " .result()\n", + " .measurement_counts\n", ")" ] }, @@ -1795,9 +1829,9 @@ "counts = result.measurement_counts\n", "\n", "# plot using Counter\n", - "plt.bar(counts.keys(), counts.values(), color='tab:orange');\n", - "plt.xlabel('bitstrings');\n", - "plt.ylabel('counts');" + "plt.bar(counts.keys(), counts.values(), color=\"tab:orange\")\n", + "plt.xlabel(\"bitstrings\")\n", + "plt.ylabel(\"counts\");" ] }, { @@ -1839,12 +1873,12 @@ "source": [ "# asyncio waiter function to leverage Task.async_result() object\n", "async def wait_on_result(async_result):\n", - " print('Waiting on task.')\n", + " print(\"Waiting on task.\")\n", " await async_result\n", "\n", - " print(f'Final task state: {async_result._state}')\n", + " print(f\"Final task state: {async_result._state}\")\n", " res = async_result.result()\n", - " \n", + "\n", " return res" ] }, @@ -1913,15 +1947,17 @@ }, "outputs": [], "source": [ - "# async_result returns back a Future. \n", + "# async_result returns back a Future.\n", "# Details on Future: https://docs.python.org/3.8/library/asyncio-future.html#asyncio.Future\n", "future = device.run(circ2, shots=100).async_result()\n", "\n", + "\n", "# this is invoked when the Future is done. i.e. task is in a terminal state.\n", "# This will print out to STDOUT when its done.\n", "def call_back_function(future):\n", " print(f\"Custom task Result: {future.result().measurement_probabilities}\")\n", "\n", + "\n", "# attached the callback function to the future.\n", "future.add_done_callback(call_back_function)" ] @@ -1957,8 +1993,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] } ], diff --git a/examples/getting_started/4_Superdense_coding/4_Superdense_coding.ipynb b/examples/getting_started/4_Superdense_coding/4_Superdense_coding.ipynb index 045019df0..ec69e845e 100644 --- a/examples/getting_started/4_Superdense_coding/4_Superdense_coding.ipynb +++ b/examples/getting_started/4_Superdense_coding/4_Superdense_coding.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -84,10 +85,10 @@ ], "source": [ "# Import Braket libraries\n", + "import matplotlib.pyplot as plt\n", + "\n", "from braket.circuits import Circuit\n", - "from braket.aws import AwsDevice\n", - "from braket.devices import Devices, LocalSimulator\n", - "import matplotlib.pyplot as plt" + "from braket.devices import LocalSimulator" ] }, { @@ -126,7 +127,6 @@ "source": [ "# Function to run quantum task, check the status thereof and collect results\n", "def get_result(device, circ):\n", - " \n", " # get number of qubits\n", " num_qubits = circ.qubit_count\n", "\n", @@ -134,33 +134,31 @@ " circ.probability()\n", "\n", " # submit quantum task: define quantum task (asynchronous)\n", - " if device.name == 'StateVectorSimulator':\n", + " if device.name == \"StateVectorSimulator\":\n", " task = device.run(circ, shots=1000)\n", " else:\n", " task = device.run(circ, shots=1000)\n", "\n", " # Get ID of submitted quantum task\n", - " task_id = task.id\n", - "# print('Task ID :', task_id)\n", + " # print('Task ID :', task_id)\n", "\n", " # Wait for job to complete\n", " status_list = []\n", " status = task.state()\n", " status_list += [status]\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", "\n", " # Only notify the user when there's a status change\n", - " while status != 'COMPLETED':\n", + " while status != \"COMPLETED\":\n", " status = task.state()\n", " if status != status_list[-1]:\n", - " print('Status:', status)\n", + " print(\"Status:\", status)\n", " status_list += [status]\n", "\n", " # get result\n", " result = task.result()\n", "\n", " # get metadata\n", - " metadata = result.task_metadata\n", "\n", " # get output probabilities\n", " probs_values = result.values[0]\n", @@ -169,19 +167,19 @@ " measurement_counts = result.measurement_counts\n", "\n", " # print measurement results\n", - " print('measurement_counts:', measurement_counts)\n", + " print(\"measurement_counts:\", measurement_counts)\n", "\n", " # bitstrings\n", - " format_bitstring = '{0:0' + str(num_qubits) + 'b}'\n", + " format_bitstring = \"{0:0\" + str(num_qubits) + \"b}\"\n", " bitstring_keys = [format_bitstring.format(ii) for ii in range(2**num_qubits)]\n", "\n", " # plot probabalities\n", " plt.bar(bitstring_keys, probs_values)\n", - " plt.xlabel('bitstrings')\n", - " plt.ylabel('probability')\n", + " plt.xlabel(\"bitstrings\")\n", + " plt.ylabel(\"probability\")\n", " plt.xticks(rotation=90)\n", - " plt.show() \n", - " \n", + " plt.show()\n", + "\n", " return measurement_counts" ] }, @@ -216,7 +214,7 @@ "source": [ "circ = Circuit()\n", "circ.h([0])\n", - "circ.cnot(0,1)" + "circ.cnot(0, 1)" ] }, { @@ -238,11 +236,12 @@ "outputs": [], "source": [ "# Four possible messages and their corresponding gates\n", - "message = {\"00\": Circuit().i(0),\n", - " \"01\": Circuit().x(0),\n", - " \"10\": Circuit().z(0),\n", - " \"11\": Circuit().x(0).z(0)\n", - " }" + "message = {\n", + " \"00\": Circuit().i(0),\n", + " \"01\": Circuit().x(0),\n", + " \"10\": Circuit().z(0),\n", + " \"11\": Circuit().x(0).z(0),\n", + "}" ] }, { @@ -322,7 +321,7 @@ } ], "source": [ - "circ.cnot(0,1)\n", + "circ.cnot(0, 1)\n", "circ.h([0])" ] }, @@ -515,13 +514,12 @@ ], "source": [ "for m in message:\n", - " \n", " # Reproduce the full circuit above by concatenating all of the gates:\n", - " newcirc = Circuit().h([0]).cnot(0,1).add_circuit(message[m]).cnot(0,1).h([0])\n", - " \n", + " newcirc = Circuit().h([0]).cnot(0, 1).add_circuit(message[m]).cnot(0, 1).h([0])\n", + "\n", " # Run the circuit:\n", " counts = get_result(device, newcirc)\n", - " \n", + "\n", " print(\"Message: \" + m + \". Results:\")\n", " print(counts)" ] @@ -550,8 +548,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" ] } ], diff --git a/examples/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job.ipynb b/examples/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job.ipynb index 4aa2d985e..317abb9e4 100644 --- a/examples/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job.ipynb +++ b/examples/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job.ipynb @@ -1,644 +1,643 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Creating your first Hybrid Job\n", - "\n", - "\n", - "This tutorial provides an introduction to running hybrid quantum-classical algorithms using\n", - "PennyLane on Amazon Braket . With Amazon Braket, you gain access to both real quantum devices and\n", - "scalable classical compute, enabling you to push the boundaries of your algorithm.\n", - "\n", - "In this tutorial, we'll walk through how to create your first hybrid quantum-classical algorithms on AWS.\n", - "With a single line of code, we'll see how to scale from PennyLane simulators on your laptop to running full-scale experiments on AWS that leverage both powerful classical compute and quantum devices.\n", - "You'll gain understanding of the hybrid jobs queue, including QPU priority queuing, and learn how to scale classical resources for resource-intensive tasks. \n", - "We hope these tools will empower you to start experimenting today with hybrid quantum algorithms!\n", - "\n", - "\n", - "\n", - "## Amazon Braket Hybrid Jobs\n", - "\n", - "Amazon Braket Hybrid Jobs offers a way for you to run hybrid quantum-classical algorithms that\n", - "require both classical resources and quantum processing units (QPUs). Hybrid Jobs is designed to\n", - "spin up the requested classical compute, run your algorithm, and release the instances after\n", - "completion so you only pay for what you use. This workflow is ideal for long-running iterative\n", - "algorithms involving both classical and quantum resources. Simply package up your code into a single\n", - "function, create a hybrid job with a single line of code, and Braket will schedule it to run as soon\n", - "as possible without interruption.\n", - "\n", - "Hybrid jobs have a separate queue from quantum tasks, so once your algorithm starts running, it will\n", - "not be interrupted by variations in the quantum task queue. This helps your long-running algorithms\n", - "run efficiently and predictably. Any quantum tasks created from a running hybrid job will be run\n", - "before any other quantum tasks in the queue. This is particularly beneficial for iterative hybrid\n", - "algorithms where subsequent tasks depend on the outcomes of prior quantum tasks. Examples of such\n", - "algorithms include the Quantum Approximate Optimization Algorithm (QAOA), Variational Quantum\n", - "Eigensolver (VQE), or Quantum Machine Learning (QML). You can also monitor your algorithm's progress in near-real\n", - "time, enabling you to keep track of costs, budget, or custom metrics such as training loss or\n", - "expectation values.\n", - "\n", - "Importantly, on specific QPUs, running your algorithm in Hybrid Jobs benefits from [parametric compilation](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs-parametric-compilation.html). \n", - "This reduces the overhead associated with the computationally expensive compilation step by compiling a circuit only once and not for every iteration in your hybrid algorithm. \n", - "This reduces the total runtime for many variational algorithms by up to 10x.\n", - "For long-running hybrid jobs, Braket automatically uses the updated calibration data from the hardware provider when compiling your circuit to ensure the highest quality results.\n", - "\n", - "## Getting started with PennyLane\n", - "\n", - "\n", - "Let’s setup an algorithm that makes use of both classical and quantum resources. We adapt the [PennyLane qubit rotation tutorial](https://pennylane.ai/qml/demos/tutorial_qubit_rotation).\n", - "\n", - "First, we define a quantum simulator to run the algorithm on. In this example, we will use the Braket local simulator before moving onto a QPU." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pennylane as qml\n", - "from pennylane import numpy as np\n", - "\n", - "device = qml.device(\"braket.local.qubit\", wires=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we define a circuit with two rotation gates and measure the expectation value in the $Z$-basis" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "@qml.qnode(device)\n", - "def circuit(params):\n", - " qml.RX(params[0], wires=0)\n", - " qml.RY(params[1], wires=0)\n", - " return qml.expval(qml.PauliZ(0))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we create a classical-quantum loop that uses gradient descent to minimize the expectation value.\n", - "\n", - "We add the ``log_metric`` function from Braket to record the training progress (see [metrics\n", - "documentation](https://amazon-braket-sdk-python.readthedocs.io/en/stable/_apidoc/braket.jobs.metrics.html)).\n", - "When running on AWS, ``log_metric`` records the metrics in [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/), which is accessible\n", - "through the Braket console page or the Braket SDK. When running locally on your laptop,\n", - "``log_metric`` prints the iteration numbers.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from braket.jobs.metrics import log_metric\n", - "\n", - "\n", - "def qubit_rotation(num_steps=10, stepsize=0.5):\n", - " opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", - " params = np.array([0.5, 0.75])\n", - "\n", - " for i in range(num_steps):\n", - " # update the circuit parameters\n", - " params = opt.step(circuit, params)\n", - " expval = circuit(params)\n", - "\n", - " log_metric(metric_name=\"expval\", iteration_number=i, value=expval)\n", - "\n", - " return params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run the entire algorithm, we call the `qubit_rotation`` function to see that it runs correctly." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Metrics - timestamp=1700084056.91118; expval=0.38894534132396147; iteration_number=0;\n", - "Metrics - timestamp=1700084056.9852457; expval=0.12290715413453956; iteration_number=1;\n", - "Metrics - timestamp=1700084057.0590365; expval=-0.09181374013482171; iteration_number=2;\n", - "Metrics - timestamp=1700084057.128326; expval=-0.2936094099948542; iteration_number=3;\n", - "Metrics - timestamp=1700084057.1863492; expval=-0.5344079938678078; iteration_number=4;\n" - ] - }, - { - "data": { - "text/plain": [ - "tensor([0.67679672, 2.32609342], requires_grad=True)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qubit_rotation(5, stepsize=0.5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Great! We see the expectation value change with each iteration number and the final parameters were returned as a list. Now, instead of running on our laptop, let’s submit this same function to be run on AWS." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running as a hybrid job\n", - "\n", - "You can execute long-running algorithms asynchronously with Amazon Braket Hybrid Jobs, \n", - "which fully manages the classical infrastructure so you can focus on the algorithm. For example, you\n", - "can train a larger circuit, or increase the number of iterations. Note that each hybrid job has\n", - "at least a one minute startup time since it creates a containerized environment on Amazon EC2. So\n", - "for very short workloads, such as a single circuit or a batch of circuits, it may suffice for you to\n", - "use quantum tasks.\n", - "\n", - "We now show how you can go from running your local Python function to running it as a hybrid job.\n", - "\n", - "
\n", - " Note: Only Python 3.10 is supported by default. For other versions, you may use hybrid job scripts, or specify a custom container image from Amazon Elastic Container Registry (ECR) (see \n", - "containers documentation).\n", - "
\n", - "\n", - "\n", - "The first step to creating a hybrid job is to annotate which function you want to run with the\n", - "`@hybrid_job` decorator. Then you create the job by invoking the function as you would for normal\n", - "Python functions. However, the decorated function returns the hybrid job handle rather than the\n", - "result of the function. To retrieve the results after it has been completed, use `job.result()`.\n", - "\n", - "For algorithms that do not need priority queueing or scheduling for on-demand QPUs, you may specify the device as `local:/` or simply `None`. For example, when using a simulator that runs on the same classical host alongside the rest of your algorithm, such as the PennyLane Lightning CPU/GPU simulators, you may set `device=\"local:pennylane/lightning.qubit\"`. \n", - "\n", - "\n", - "The required device argument in the `@hybrid_job` decorator specifies the QPU that the hybrid job\n", - "will have priority access to.\n", - "The device string you give is accessible in the hybrid job instance as the environment variable ``\"AMZN_BRAKET_DEVICE_ARN\"``.\n", - "In the following code, we annotate the `qubit_rotation` function from above.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "from braket.jobs import hybrid_job, save_job_result\n", - "\n", - "\n", - "@hybrid_job(device=\"local:braket/default\")\n", - "def qubit_rotation_hybrid_job(num_steps=1, stepsize=0.5):\n", - " device = qml.device(\"braket.local.qubit\", wires=1)\n", - "\n", - " @qml.qnode(device)\n", - " def circuit(params):\n", - " qml.RX(params[0], wires=0)\n", - " qml.RY(params[1], wires=0)\n", - " return qml.expval(qml.PauliZ(0))\n", - "\n", - " opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", - " params = np.array([0.5, 0.75])\n", - "\n", - " for i in range(num_steps):\n", - " # update the circuit parameters\n", - " params = opt.step(circuit, params)\n", - " expval = circuit(params)\n", - "\n", - " log_metric(metric_name=\"expval\", iteration_number=i, value=expval)\n", - "\n", - " return params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we create a hybrid job by calling the function as usual. This returns an `AwsQuantumJob` object that contains the device ARN, region, and job name." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AwsQuantumJob('arn':'arn:aws:braket:us-west-2:318845237731:job/qubit-rotation-hybrid-job-1700084057462')\n" - ] - } - ], - "source": [ - "job = qubit_rotation_hybrid_job(num_steps=10, stepsize=0.5)\n", - "print(job)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The hybrid job automatically captures the function arguments as [hyperparameters](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs-hyperparameters.html).\n", - "In this case, we set `num_steps = 10` and `stepsize = 0.5` as the hyperparameters." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can check the status with:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'QUEUED'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job.state()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once the hybrid job starts, it will change the status to `RUNNING`. We can also check the hybrid job status in the Braket console.\n", - "\n", - "We can monitor the metrics in near-real time in the [Braket console page](https://console.aws.amazon.com/braket/) as shown below. \n", - "\n", - "![Training to minimize an expectation value.](console_figures/expval.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the hybrid job completes, we can get the results with `job.result()`. For this example, it should take approximately 2 minutes." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': tensor([0.03642036, 3.10081929], requires_grad=True)}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job.result()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Any objects in the return statement are automatically captured by Braket. Note that the objects returned by the function must be a tuple with each element being serializable as text. \n", - "\n", - "Additionally, we can plot the metrics recording during the algorithm. Below we show the expectation value decreases with each iteration as expected." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'timestamp': [1700084189.268808, 1700084189.3246114, 1700084189.3840628, 1700084189.1557567, 1700084189.2123241, 1700084188.8748374, 1700084188.9313, 1700084188.9881024, 1700084189.0439024, 1700084189.099711], 'expval': [-0.9771543186187628, -0.9940804663947356, -0.9985062848699056, -0.7715298984378987, -0.9193547392516985, 0.38894534132396147, 0.12290715413453956, -0.09181374013482171, -0.2936094099948542, -0.5344079938678078], 'iteration_number': [7.0, 8.0, 9.0, 5.0, 6.0, 0.0, 1.0, 2.0, 3.0, 4.0]}\n" - ] - } - ], - "source": [ - "# May need to wait a bit before metrics show up\n", - "# If metrics aren't there, try again after 5 seconds\n", - "import time\n", - "\n", - "time.sleep(10)\n", - "print(job.metrics())" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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5ntMnz592LlzJ7Nnz2bz5s10796de+65hw0bNpRQahHxStHdof0sCKruuj2oBrT9Epo8DzYf+P0z+KEZHF1hTU4R8YwFFbdv307Dhg1Zs2YNsbGxAMybN4+uXbty4MABoqKicj2uQoUKvPfee9x///3ObZUrV+aVV15hwIABBXpvLagoIkXmyP5rFtlhc0xQeHvzjBHAsZ/N65Kl7zGvZN/oWWg8Cuy+1mYWKSPK1IKKiYmJhIaGOksQQHx8PHa7nVWrVuV5XJs2bZgxYwbHjx/H4XDwxRdfcObMGTp16pTnMWfPniUtLc3lJiJSJHYfiOwEMb3Mn+dLEECV66DrRoi531x7aMvz8FMHOLXborAi3skjilBycjIREREu23x9fQkLCyM5OTnP47788kvOnTtH5cqV8ff35+GHH+abb76hXr16eR6TkJBASEiI8xYdHe22zyEi4qJcMLT5D7T5DMqFwLFEmNsc9nxqdTIRr2FpERoxYgQ2my3f244dO4r8+qNGjeLEiRP89NNPrF27luHDh3PPPfeweXNeq77CyJEjSU1Ndd72799f5PcXESmQmF7QdROEt4Osk5B4vwZSi5QQS8cIHT16lD/++CPfferUqcOnn37K448/zp9//uncnpWVRUBAADNnzuTOO+/McVxSUhL16tVjy5YtNGrUyLk9Pj6eevXqMXny5AJl1BghESkxjizYmgBbxoKRDeVjzCvah7e1OpmIxyno329LR+WFh4cTHh5+yf1at27NiRMnWLduHS1atABg4cKFOBwOWrVqlesxGRkZANjtrie9fHx8cDgcl5lcRKQY2H2hySioGg8re5sDqX/qAI1GQeNnNZBapBh4xBihBg0acNNNN/HQQw+xevVqVqxYwaBBg7j33nudM8YOHjxI/fr1Wb16NQD169enXr16PPzww6xevZqkpCTeeOMN5s+fT7du3Sz8NCIilxDe+qKB1GP/Gki9x+pkImWORxQhgOnTp1O/fn3i4uLo2rUr7dq144MPPnA+f+7cOXbu3Ok8E1SuXDnmzp1LeHg4t912G02bNuU///kP06ZNo2vXrlZ9DBGRgnEZSB3810DqZhpILeJmHrGOkJU0RkhELHdqLyT+48LCi7Xug5bvgl+IpbFESrMytY6QiIhXqxADcYsvWpG6uVakFnEDFSEREU9wfiB1/DIoXxvS95rj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BSAlJYVq1S78QlNSUmjevHmex/n7++Pvrysbi4hIKWL3MWdULeuBObYpl7FOLSaUvjNcFytooQtvX2KRLC1C4eHhhIeHF8tr165dm6pVq7JgwQJn8UlLS2PVqlU88sgjxfKeIiIixcbKsU7uUgoLnceMEdq3bx/Hjx9n3759ZGdns3HjRgDq1atHhQoVAKhfvz4JCQnceeed2Gw2hg0bxgsvvMAVV1zhnD4fFRVFt27drPsgIiIiReUpY53yU8oKnccUoeeee45p06Y5H1999dUALFq0iE6dOgGwc+dOUlNTnfs89dRTpKenM3DgQE6cOEG7du2YN2+e1hASERHP5cljnc4rRYXO49YRKmlaR0hERMTzFPTvdy5reIuIiIh4BxUhERER8VoqQiIiIuK1VIRERETEa6kIiYiIiNdSERIRERGvpSIkIiIiXktFSERERLyWipCIiIh4LY+5xIZVzi+8nZaWZnESERERKajzf7cvdQENFaFLOHnyJADR0dEWJxEREZHCOnnyJCEhIXk+r2uNXYLD4eDQoUNUrFgRm83mttdNS0sjOjqa/fv36xpmpYT+TUoX/XuULvr3KF3073FphmFw8uRJoqKisNvzHgmkM0KXYLfbqVGjRrG9fnBwsP6PuJTRv0npon+P0kX/HqWL/j3yl9+ZoPM0WFpERES8loqQiIiIeC0VIYv4+/szevRo/P39rY4if9G/Semif4/SRf8epYv+PdxHg6VFRETEa+mMkIiIiHgtFSERERHxWipCIiIi4rVUhERERMRrqQhZ5J133iEmJoaAgABatWrF6tWrrY7klRISEmjZsiUVK1YkIiKCbt26sXPnTqtjyV9efvllbDYbw4YNszqKVzt48CD/+Mc/qFy5MoGBgTRp0oS1a9daHcsrZWdnM2rUKGrXrk1gYCB169Zl3Lhxl7yeluRNRcgCM2bMYPjw4YwePZr169fTrFkzunTpwpEjR6yO5nWWLFnCo48+ys8//8z8+fM5d+4cN954I+np6VZH83pr1qzh/fffp2nTplZH8Wp//vknbdu2pVy5cvzwww9s27aNN954g0qVKlkdzSu98sorvPfee0yaNInt27fzyiuv8Oqrr/L2229bHc1jafq8BVq1akXLli2ZNGkSYF7PLDo6msGDBzNixAiL03m3o0ePEhERwZIlS+jQoYPVcbzWqVOnuOaaa3j33Xd54YUXaN68ORMmTLA6llcaMWIEK1asYNmyZVZHEeDWW28lMjKSjz76yLntrrvuIjAwkE8//dTCZJ5LZ4RKWGZmJuvWrSM+Pt65zW63Ex8fT2JiooXJBCA1NRWAsLAwi5N4t0cffZRbbrnF5f9PxBqzZ88mNjaWu+++m4iICK6++mqmTJlidSyv1aZNGxYsWMCuXbsA2LRpE8uXL+fmm2+2OJnn0kVXS9ixY8fIzs4mMjLSZXtkZCQ7duywKJWAeWZu2LBhtG3blsaNG1sdx2t98cUXrF+/njVr1lgdRYDdu3fz3nvvMXz4cJ5++mnWrFnDkCFD8PPzo2/fvlbH8zojRowgLS2N+vXr4+PjQ3Z2Ni+++CK9e/e2OprHUhES+cujjz7Kli1bWL58udVRvNb+/fsZOnQo8+fPJyAgwOo4gvkfCLGxsbz00ksAXH311WzZsoXJkyerCFngyy+/ZPr06Xz22Wc0atSIjRs3MmzYMKKiovTvUUQqQiWsSpUq+Pj4kJKS4rI9JSWFqlWrWpRKBg0axJw5c1i6dCk1atSwOo7XWrduHUeOHOGaa65xbsvOzmbp0qVMmjSJs2fP4uPjY2FC71OtWjUaNmzosq1BgwZ89dVXFiXybk8++SQjRozg3nvvBaBJkyb8/vvvJCQkqAgVkcYIlTA/Pz9atGjBggULnNscDgcLFiygdevWFibzToZhMGjQIL755hsWLlxI7dq1rY7k1eLi4ti8eTMbN2503mJjY+nduzcbN25UCbJA27ZtcywpsWvXLmrVqmVRIu+WkZGB3e76p9vHxweHw2FRIs+nM0IWGD58OH379iU2NpZrr72WCRMmkJ6eTr9+/ayO5nUeffRRPvvsM7777jsqVqxIcnIyACEhIQQGBlqczvtUrFgxx/is8uXLU7lyZY3bsshjjz1GmzZteOmll7jnnntYvXo1H3zwAR988IHV0bzSbbfdxosvvkjNmjVp1KgRGzZs4M033+TBBx+0OprH0vR5i0yaNInXXnuN5ORkmjdvzltvvUWrVq2sjuV1bDZbrts//vhjHnjggZINI7nq1KmTps9bbM6cOYwcOZJff/2V2rVrM3z4cB566CGrY3mlkydPMmrUKL755huOHDlCVFQUvXr14rnnnsPPz8/qeB5JRUhERES8lsYIiYiIiNdSERIRERGvpSIkIiIiXktFSERERLyWipCIiIh4LRUhERER8VoqQiIiIuK1VIREJFedOnVi2LBhVsfIwWaz8e2331odo9iMGTOG5s2bWx1DxGuoCIlIrr7++mvGjRvnfBwTE1OiqzvnVQgOHz7MzTffXGI5RKRs07XGRCRXYWFhxfK6mZmZl3UpgKpVq7oxjfc4d+4c5cqVszqGSKmjM0Iikqu/fzXWqVMnfv/9dx577DFsNpvLNdqWL19O+/btCQwMJDo6miFDhpCenu58PiYmhnHjxtGnTx+Cg4MZOHAgAP/617+48sorCQoKok6dOowaNYpz584BMHXqVMaOHcumTZuc7zd16lQg51djmzdvpnPnzgQGBlK5cmUGDhzIqVOnnM8/8MADdOvWjddff51q1apRuXJlHn30Ued75eb82ahPPvmEmJgYQkJCuPfeezl58qTL57r4DFnz5s0ZM2aM87HNZuP999/n1ltvJSgoiAYNGpCYmMhvv/1Gp06dKF++PG3atCEpKSlHhvfff5/o6GiCgoK45557SE1NdXn+ww8/pEGDBgQEBFC/fn3effdd53N79+7FZrMxY8YMOnbsSEBAANOnT8/z84p4MxUhEbmkr7/+mho1avD8889z+PBhDh8+DEBSUhI33XQTd911F7/88gszZsxg+fLlDBo0yOX4119/nWbNmrFhwwZGjRoFmFeanzp1Ktu2bWPixIlMmTKF8ePHA9CzZ08ef/xxGjVq5Hy/nj175siVnp5Oly5dqFSpEmvWrGHmzJn89NNPOd5/0aJFJCUlsWjRIqZNm8bUqVOdxSovSUlJfPvtt8yZM4c5c+awZMkSXn755UL/7s6XwI0bN1K/fn3uu+8+Hn74YUaOHMnatWsxDCNH3t9++40vv/yS//73v8ybN48NGzbwz3/+0/n89OnTee6553jxxRfZvn07L730EqNGjWLatGkurzNixAiGDh3K9u3b6dKlS6Gzi3gFQ0QkFx07djSGDh3qfFyrVi1j/PjxLvv079/fGDhwoMu2ZcuWGXa73Th9+rTzuG7dul3y/V577TWjRYsWzsejR482mjVrlmM/wPjmm28MwzCMDz74wKhUqZJx6tQp5/Pff/+9YbfbjeTkZMMwDKNv375GrVq1jKysLOc+d999t9GzZ888s4wePdoICgoy0tLSnNuefPJJo1WrVs7Huf0+mjVrZowePdol67PPPut8nJiYaADGRx995Nz2+eefGwEBAS7v7ePjYxw4cMC57YcffjDsdrtx+PBhwzAMo27dusZnn33m8t7jxo0zWrdubRiGYezZs8cAjAkTJuT5GUXEpDFCIlJkmzZt4pdffnH52sUwDBwOB3v27KFBgwYAxMbG5jh2xowZvPXWWyQlJXHq1CmysrIIDg4u1Ptv376dZs2aUb58eee2tm3b4nA42LlzJ5GRkQA0atQIHx8f5z7VqlVj8+bN+b52TEwMFStWdDnmyJEjhcoH0LRpU+f983maNGnisu3MmTOkpaU5P3/NmjWpXr26c5/WrVs7P1PFihVJSkqif//+PPTQQ859srKyCAkJcXnv3H7vIuJKRUhEiuzUqVM8/PDDDBkyJMdzNWvWdN7/e1EBSExMpHfv3owdO5YuXboQEhLCF198wRtvvFEsOS8eJGyz2XA4HJd1jN1uxzAMl31yG3f099c5P7Yqt22XynPe+fFPU6ZMoVWrVi7P/b3sQc7fu4jkpCIkIgXi5+dHdna2y7ZrrrmGbdu2Ua9evUK91sqVK6lVqxbPPPOMc9vvv/9+yfe7WIMGDZg6dSrp6enOP/orVqzAbrdz1VVXFSpTYYWHhzvHSgGkpaWxZ88et7z2vn37OHToEFFRUQD8/PPPzs8UGRlJVFQUu3fvpnfv3m55PxFvpsHSIlIgMTExLF26lIMHD3Ls2DHAnPm1cuVKBg0axMaNG/n111/57rvvcgz+vdgVV1zBvn37+OKLL0hKSuKtt97im2++yfF+e/bsYePGjRw7doyzZ8/meJ3evXsTEBBA37592bJlC4sWLWLw4MHcf//9zq+hikvnzp355JNPWLZsGZs3b6Zv3745zsgU1fnPtGnTJpYtW8aQIUO45557nEsHjB07loSEBN566y127drF5s2b+fjjj3nzzTfd8v4i3kRFSEQK5Pnnn2fv3r3UrVuX8PBwwBz/smTJEnbt2kX79u25+uqree6555xnMvJy++2389hjjzFo0CCaN2/OypUrnbPJzrvrrru46aabuP766wkPD+fzzz/P8TpBQUH873//4/jx47Rs2ZIePXoQFxfHpEmT3PfB8zBy5Eg6duzIrbfeyi233EK3bt2oW7euW167Xr16dO/ena5du3LjjTfStGlTl+nxAwYM4MMPP+Tjjz+mSZMmdOzYkalTp1K7dm23vL+IN7EZF3/JLSIiIuIldEZIREREvJaKkIiIiHgtFSERERHxWipCIiIi4rVUhERERMRrqQiJiIiI11IREhEREa+lIiQiIiJeS0VIREREvJaKkIiIiHgtFSERERHxWipCIiIi4rX+H0HDQ1UntDG8AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "import pandas as pd\n", - "\n", - "df = pd.DataFrame(job.metrics())\n", - "df.sort_values(by=[\"iteration_number\"], inplace=True)\n", - "\n", - "plt.plot(df[\"iteration_number\"], df[\"expval\"], \"-o\", color=\"orange\")\n", - "plt.xlabel(\"iteration number\")\n", - "plt.ylabel(\"expectation value\")\n", - "plt.title(\"Simulator results\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running on a QPU with priority\n", - "\n", - "The next step is to see how well the qubit rotation works on a real QPU. We\n", - "create a hybrid job with the Rigetti device as the priority QPU. We also increase the number of\n", - "steps to 10.\n", - "\n", - "Using hybrid jobs for iterative algorithms is very beneficial because you retain priority access to the\n", - "target QPU. So once your quantum tasks are created in the hybrid job, they run ahead of other tasks\n", - "waiting in the *quantum task queue*. This means your\n", - "algorithm will not be interrupted by other quantum tasks, so it will run more efficiently and\n", - "predictably. Quantum tasks submitted as part of a hybrid job have priority, and are aggregated in the *priority task queue*.\n", - "\n", - "Hybrid jobs have their own *hybrid jobs queue* so that only a single\n", - "hybrid job can run on a QPU at a time. Each QPU has its own hybrid jobs queue. Note that this is a different queue from the quantum tasks. For a single quantum circuit, or a batch of circuit, it’s\n", - "recommended to create quantum tasks instead of hybrid jobs. For more information on quantum tasks and hybrid jobs queue see the [Amazon Braket documentation](https://docs.aws.amazon.com/braket/latest/developerguide/braket-task-when.html).\n", - "\n", - "To get QPU priority, you must ensure that the device ARN used within the function matches that\n", - "specified in the decorator. For convenience, you can use the helper function ``get_device_arn()`` to\n", - "automatically capture the device ARN declared in ``@hybrid_job``.\n", - "\n", - "
\n", - " Note: Only hybrid jobs running on AWS receive priority. Hybrid jobs running locally, or with a mismatched device ARN do not get priority task queueing. \n", - "
\n", - "\n", - "In the previous example, we declared the local simulator outside the decorated function scope.\n", - "However, for AWS devices such as QPUs or on-demand simulators, the device must be declared within the function scope. \n", - "\n", - "
\n", - " Note: AWS devices must be declared within the body of the decorated function.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from braket.devices import Devices\n", - "\n", - "\n", - "device_arn = Devices.Rigetti.Ankaa2\n", - "\n", - "\n", - "@hybrid_job(device=device_arn) # set priority QPU\n", - "def qpu_qubit_rotation_hybrid_job(num_steps=10, stepsize=0.5):\n", - " # AWS devices must be declared within the decorated function.\n", - " device = qml.device(\n", - " \"braket.aws.qubit\",\n", - " device_arn=device_arn.value, # Make sure the device ARN matches the hybrid job device ARN\n", - " wires=2,\n", - " shots=1_000,\n", - " )\n", - "\n", - " @qml.qnode(device)\n", - " def circuit(params):\n", - " qml.RX(params[0], wires=0)\n", - " qml.RY(params[1], wires=0)\n", - " return qml.expval(qml.PauliZ(0))\n", - "\n", - " opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", - " params = np.array([0.5, 0.75])\n", - "\n", - " for i in range(num_steps):\n", - " # update the circuit parameters\n", - " params = opt.step(circuit, params)\n", - " expval = circuit(params)\n", - "\n", - " log_metric(metric_name=\"expval\", iteration_number=i, value=expval)\n", - "\n", - " return params" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To get a sense of how long we will wait before the hybrid job runs, we can check the hybrid job\n", - "queue depth with `AwsDevice(device_arn).queue_depth().jobs`. We can also check if the device is\n", - "currently available with `AwsDevice(device_arn).is_available()`.\n", - "\n", - "You can check the queue depth on the devices page of the [Amazon Braket Console](https://console.aws.amazon.com/braket/home). Below, we show the devices page for Rigetti Ankaa-2.\n", - "\n", - "![Rigetti Ankaa-2 showing the queue depths.](console_figures/queue_viz.png)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "When there are no other hybrid jobs in the queue ahead of you, and the device is available, the hybrid job will start running.\n", - "\n", - "
\n", - " Note: Running the following cell will only run once the QPU is available. This may take a long time and will result in usage fees charged to your AWS account. Only run the cell if you are comfortable with the potential wait-time and costs. We recommend monitoring the Billing & Cost Management Dashboard on the AWS console.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AwsQuantumJob('arn':'arn:aws:braket:us-west-2:318845237731:job/qpu-qubit-rotation-hybrid-job-1700084458165')\n" - ] - } - ], - "source": [ - "qpu_job = qpu_qubit_rotation_hybrid_job(num_steps=10, stepsize=0.5)\n", - "print(qpu_job)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we wait for the algorithm to complete and download the result. " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'result': tensor([0.0205, 3.1065], requires_grad=True)}" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qpu_job.result()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we plot the expectation value per iteration number below. We see that on a real QPU, the data is not as smooth as the simulator, but the minimum still is detected correctly!" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'timestamp': [1700084730.969484, 1700084698.0504165, 1700084679.9848497, 1700084664.1287766, 1700084648.2972944, 1700084632.2871127, 1700084616.684862], 'expval': [-0.972, -0.784, -0.548, -0.36, -0.07, 0.11, 0.388], 'iteration_number': [7.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0]}\n" - ] - } - ], - "source": [ - "# May need to wait a bit before metrics show up\n", - "# If metrics aren't there, try again after 5 seconds\n", - "import time\n", - "\n", - "time.sleep(10)\n", - "print(qpu_job.metrics())" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "df = pd.DataFrame(qpu_job.metrics())\n", - "df.sort_values(by=[\"iteration_number\"], inplace=True)\n", - "\n", - "plt.plot(df[\"iteration_number\"], df[\"expval\"], \"-o\", color=\"teal\")\n", - "plt.xlabel(\"iteration number\")\n", - "plt.ylabel(\"expectation value\")\n", - "plt.title(\"QPU results\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. \n", - " Estimated charges shown may differ from your actual charges. \n", - " Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2)\n", - " Estimated cost to run this example is $39 USD.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conclusion\n", - "\n", - "In this tutorial, we showed how to migrate from local Python functions to running algorithms on simulators and QPUs on Amazon Braket.\n", - "We adapted the simple example of rotating a qubit using gradient descent, running this on both a\n", - "local simulator and a real QPU. \n", - "Using Amazon Braket Hybrid Jobs allowed us to run algorithms asynchronously, scale classical compute using AWS, and obtain priority access to the selected QPU for the duration of our algorithm." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "conda_braket", - "language": "python", - "name": "conda_braket" - }, - "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.13" - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creating your first Hybrid Job\n", + "\n", + "\n", + "This tutorial provides an introduction to running hybrid quantum-classical algorithms using\n", + "PennyLane on Amazon Braket . With Amazon Braket, you gain access to both real quantum devices and\n", + "scalable classical compute, enabling you to push the boundaries of your algorithm.\n", + "\n", + "In this tutorial, we'll walk through how to create your first hybrid quantum-classical algorithms on AWS.\n", + "With a single line of code, we'll see how to scale from PennyLane simulators on your laptop to running full-scale experiments on AWS that leverage both powerful classical compute and quantum devices.\n", + "You'll gain understanding of the hybrid jobs queue, including QPU priority queuing, and learn how to scale classical resources for resource-intensive tasks. \n", + "We hope these tools will empower you to start experimenting today with hybrid quantum algorithms!\n", + "\n", + "\n", + "\n", + "## Amazon Braket Hybrid Jobs\n", + "\n", + "Amazon Braket Hybrid Jobs offers a way for you to run hybrid quantum-classical algorithms that\n", + "require both classical resources and quantum processing units (QPUs). Hybrid Jobs is designed to\n", + "spin up the requested classical compute, run your algorithm, and release the instances after\n", + "completion so you only pay for what you use. This workflow is ideal for long-running iterative\n", + "algorithms involving both classical and quantum resources. Simply package up your code into a single\n", + "function, create a hybrid job with a single line of code, and Braket will schedule it to run as soon\n", + "as possible without interruption.\n", + "\n", + "Hybrid jobs have a separate queue from quantum tasks, so once your algorithm starts running, it will\n", + "not be interrupted by variations in the quantum task queue. This helps your long-running algorithms\n", + "run efficiently and predictably. Any quantum tasks created from a running hybrid job will be run\n", + "before any other quantum tasks in the queue. This is particularly beneficial for iterative hybrid\n", + "algorithms where subsequent tasks depend on the outcomes of prior quantum tasks. Examples of such\n", + "algorithms include the Quantum Approximate Optimization Algorithm (QAOA), Variational Quantum\n", + "Eigensolver (VQE), or Quantum Machine Learning (QML). You can also monitor your algorithm's progress in near-real\n", + "time, enabling you to keep track of costs, budget, or custom metrics such as training loss or\n", + "expectation values.\n", + "\n", + "Importantly, on specific QPUs, running your algorithm in Hybrid Jobs benefits from [parametric compilation](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs-parametric-compilation.html). \n", + "This reduces the overhead associated with the computationally expensive compilation step by compiling a circuit only once and not for every iteration in your hybrid algorithm. \n", + "This reduces the total runtime for many variational algorithms by up to 10x.\n", + "For long-running hybrid jobs, Braket automatically uses the updated calibration data from the hardware provider when compiling your circuit to ensure the highest quality results.\n", + "\n", + "## Getting started with PennyLane\n", + "\n", + "\n", + "Let’s setup an algorithm that makes use of both classical and quantum resources. We adapt the [PennyLane qubit rotation tutorial](https://pennylane.ai/qml/demos/tutorial_qubit_rotation).\n", + "\n", + "First, we define a quantum simulator to run the algorithm on. In this example, we will use the Braket local simulator before moving onto a QPU." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pennylane as qml\n", + "from pennylane import numpy as np\n", + "\n", + "device = qml.device(\"braket.local.qubit\", wires=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we define a circuit with two rotation gates and measure the expectation value in the $Z$-basis" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "@qml.qnode(device)\n", + "def circuit(params):\n", + " qml.RX(params[0], wires=0)\n", + " qml.RY(params[1], wires=0)\n", + " return qml.expval(qml.PauliZ(0))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we create a classical-quantum loop that uses gradient descent to minimize the expectation value.\n", + "\n", + "We add the ``log_metric`` function from Braket to record the training progress (see [metrics\n", + "documentation](https://amazon-braket-sdk-python.readthedocs.io/en/stable/_apidoc/braket.jobs.metrics.html)).\n", + "When running on AWS, ``log_metric`` records the metrics in [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/), which is accessible\n", + "through the Braket console page or the Braket SDK. When running locally on your laptop,\n", + "``log_metric`` prints the iteration numbers.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from braket.jobs.metrics import log_metric\n", + "\n", + "\n", + "def qubit_rotation(num_steps=10, stepsize=0.5):\n", + " opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", + " params = np.array([0.5, 0.75])\n", + "\n", + " for i in range(num_steps):\n", + " # update the circuit parameters\n", + " params = opt.step(circuit, params)\n", + " expval = circuit(params)\n", + "\n", + " log_metric(metric_name=\"expval\", iteration_number=i, value=expval)\n", + "\n", + " return params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run the entire algorithm, we call the `qubit_rotation`` function to see that it runs correctly." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics - timestamp=1700084056.91118; expval=0.38894534132396147; iteration_number=0;\n", + "Metrics - timestamp=1700084056.9852457; expval=0.12290715413453956; iteration_number=1;\n", + "Metrics - timestamp=1700084057.0590365; expval=-0.09181374013482171; iteration_number=2;\n", + "Metrics - timestamp=1700084057.128326; expval=-0.2936094099948542; iteration_number=3;\n", + "Metrics - timestamp=1700084057.1863492; expval=-0.5344079938678078; iteration_number=4;\n" + ] }, - "nbformat": 4, - "nbformat_minor": 4 + { + "data": { + "text/plain": [ + "tensor([0.67679672, 2.32609342], requires_grad=True)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qubit_rotation(5, stepsize=0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Great! We see the expectation value change with each iteration number and the final parameters were returned as a list. Now, instead of running on our laptop, let’s submit this same function to be run on AWS." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running as a hybrid job\n", + "\n", + "You can execute long-running algorithms asynchronously with Amazon Braket Hybrid Jobs, \n", + "which fully manages the classical infrastructure so you can focus on the algorithm. For example, you\n", + "can train a larger circuit, or increase the number of iterations. Note that each hybrid job has\n", + "at least a one minute startup time since it creates a containerized environment on Amazon EC2. So\n", + "for very short workloads, such as a single circuit or a batch of circuits, it may suffice for you to\n", + "use quantum tasks.\n", + "\n", + "We now show how you can go from running your local Python function to running it as a hybrid job.\n", + "\n", + "
\n", + " Note: Only Python 3.10 is supported by default. For other versions, you may use hybrid job scripts, or specify a custom container image from Amazon Elastic Container Registry (ECR) (see \n", + "containers documentation).\n", + "
\n", + "\n", + "\n", + "The first step to creating a hybrid job is to annotate which function you want to run with the\n", + "`@hybrid_job` decorator. Then you create the job by invoking the function as you would for normal\n", + "Python functions. However, the decorated function returns the hybrid job handle rather than the\n", + "result of the function. To retrieve the results after it has been completed, use `job.result()`.\n", + "\n", + "For algorithms that do not need priority queueing or scheduling for on-demand QPUs, you may specify the device as `local:/` or simply `None`. For example, when using a simulator that runs on the same classical host alongside the rest of your algorithm, such as the PennyLane Lightning CPU/GPU simulators, you may set `device=\"local:pennylane/lightning.qubit\"`. \n", + "\n", + "\n", + "The required device argument in the `@hybrid_job` decorator specifies the QPU that the hybrid job\n", + "will have priority access to.\n", + "The device string you give is accessible in the hybrid job instance as the environment variable ``\"AMZN_BRAKET_DEVICE_ARN\"``.\n", + "In the following code, we annotate the `qubit_rotation` function from above.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from braket.jobs import hybrid_job\n", + "\n", + "\n", + "@hybrid_job(device=\"local:braket/default\")\n", + "def qubit_rotation_hybrid_job(num_steps=1, stepsize=0.5):\n", + " device = qml.device(\"braket.local.qubit\", wires=1)\n", + "\n", + " @qml.qnode(device)\n", + " def circuit(params):\n", + " qml.RX(params[0], wires=0)\n", + " qml.RY(params[1], wires=0)\n", + " return qml.expval(qml.PauliZ(0))\n", + "\n", + " opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", + " params = np.array([0.5, 0.75])\n", + "\n", + " for i in range(num_steps):\n", + " # update the circuit parameters\n", + " params = opt.step(circuit, params)\n", + " expval = circuit(params)\n", + "\n", + " log_metric(metric_name=\"expval\", iteration_number=i, value=expval)\n", + "\n", + " return params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we create a hybrid job by calling the function as usual. This returns an `AwsQuantumJob` object that contains the device ARN, region, and job name." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AwsQuantumJob('arn':'arn:aws:braket:us-west-2:318845237731:job/qubit-rotation-hybrid-job-1700084057462')\n" + ] + } + ], + "source": [ + "job = qubit_rotation_hybrid_job(num_steps=10, stepsize=0.5)\n", + "print(job)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The hybrid job automatically captures the function arguments as [hyperparameters](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs-hyperparameters.html).\n", + "In this case, we set `num_steps = 10` and `stepsize = 0.5` as the hyperparameters." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can check the status with:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'QUEUED'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the hybrid job starts, it will change the status to `RUNNING`. We can also check the hybrid job status in the Braket console.\n", + "\n", + "We can monitor the metrics in near-real time in the [Braket console page](https://console.aws.amazon.com/braket/) as shown below. \n", + "\n", + "![Training to minimize an expectation value.](console_figures/expval.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After the hybrid job completes, we can get the results with `job.result()`. For this example, it should take approximately 2 minutes." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'result': tensor([0.03642036, 3.10081929], requires_grad=True)}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Any objects in the return statement are automatically captured by Braket. Note that the objects returned by the function must be a tuple with each element being serializable as text. \n", + "\n", + "Additionally, we can plot the metrics recording during the algorithm. Below we show the expectation value decreases with each iteration as expected." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'timestamp': [1700084189.268808, 1700084189.3246114, 1700084189.3840628, 1700084189.1557567, 1700084189.2123241, 1700084188.8748374, 1700084188.9313, 1700084188.9881024, 1700084189.0439024, 1700084189.099711], 'expval': [-0.9771543186187628, -0.9940804663947356, -0.9985062848699056, -0.7715298984378987, -0.9193547392516985, 0.38894534132396147, 0.12290715413453956, -0.09181374013482171, -0.2936094099948542, -0.5344079938678078], 'iteration_number': [7.0, 8.0, 9.0, 5.0, 6.0, 0.0, 1.0, 2.0, 3.0, 4.0]}\n" + ] + } + ], + "source": [ + "# May need to wait a bit before metrics show up\n", + "# If metrics aren't there, try again after 5 seconds\n", + "import time\n", + "\n", + "time.sleep(10)\n", + "print(job.metrics())" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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5ntMnz592LlzJ7Nnz2bz5s10796de+65hw0bNpRQahHxStHdof0sCKruuj2oBrT9Epo8DzYf+P0z+KEZHF1hTU4R8YwFFbdv307Dhg1Zs2YNsbGxAMybN4+uXbty4MABoqKicj2uQoUKvPfee9x///3ObZUrV+aVV15hwIABBXpvLagoIkXmyP5rFtlhc0xQeHvzjBHAsZ/N65Kl7zGvZN/oWWg8Cuy+1mYWKSPK1IKKiYmJhIaGOksQQHx8PHa7nVWrVuV5XJs2bZgxYwbHjx/H4XDwxRdfcObMGTp16pTnMWfPniUtLc3lJiJSJHYfiOwEMb3Mn+dLEECV66DrRoi531x7aMvz8FMHOLXborAi3skjilBycjIREREu23x9fQkLCyM5OTnP47788kvOnTtH5cqV8ff35+GHH+abb76hXr16eR6TkJBASEiI8xYdHe22zyEi4qJcMLT5D7T5DMqFwLFEmNsc9nxqdTIRr2FpERoxYgQ2my3f244dO4r8+qNGjeLEiRP89NNPrF27luHDh3PPPfeweXNeq77CyJEjSU1Ndd72799f5PcXESmQmF7QdROEt4Osk5B4vwZSi5QQS8cIHT16lD/++CPfferUqcOnn37K448/zp9//uncnpWVRUBAADNnzuTOO+/McVxSUhL16tVjy5YtNGrUyLk9Pj6eevXqMXny5AJl1BghESkxjizYmgBbxoKRDeVjzCvah7e1OpmIxyno329LR+WFh4cTHh5+yf1at27NiRMnWLduHS1atABg4cKFOBwOWrVqlesxGRkZANjtrie9fHx8cDgcl5lcRKQY2H2hySioGg8re5sDqX/qAI1GQeNnNZBapBh4xBihBg0acNNNN/HQQw+xevVqVqxYwaBBg7j33nudM8YOHjxI/fr1Wb16NQD169enXr16PPzww6xevZqkpCTeeOMN5s+fT7du3Sz8NCIilxDe+qKB1GP/Gki9x+pkImWORxQhgOnTp1O/fn3i4uLo2rUr7dq144MPPnA+f+7cOXbu3Ok8E1SuXDnmzp1LeHg4t912G02bNuU///kP06ZNo2vXrlZ9DBGRgnEZSB3810DqZhpILeJmHrGOkJU0RkhELHdqLyT+48LCi7Xug5bvgl+IpbFESrMytY6QiIhXqxADcYsvWpG6uVakFnEDFSEREU9wfiB1/DIoXxvS95rj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BSAlJYVq1S78QlNSUmjevHmex/n7++Pvrysbi4hIKWL3MWdULeuBObYpl7FOLSaUvjNcFytooQtvX2KRLC1C4eHhhIeHF8tr165dm6pVq7JgwQJn8UlLS2PVqlU88sgjxfKeIiIixcbKsU7uUgoLnceMEdq3bx/Hjx9n3759ZGdns3HjRgDq1atHhQoVAKhfvz4JCQnceeed2Gw2hg0bxgsvvMAVV1zhnD4fFRVFt27drPsgIiIiReUpY53yU8oKnccUoeeee45p06Y5H1999dUALFq0iE6dOgGwc+dOUlNTnfs89dRTpKenM3DgQE6cOEG7du2YN2+e1hASERHP5cljnc4rRYXO49YRKmlaR0hERMTzFPTvdy5reIuIiIh4BxUhERER8VoqQiIiIuK1VIRERETEa6kIiYiIiNdSERIRERGvpSIkIiIiXktFSERERLyWipCIiIh4LY+5xIZVzi+8nZaWZnESERERKajzf7cvdQENFaFLOHnyJADR0dEWJxEREZHCOnnyJCEhIXk+r2uNXYLD4eDQoUNUrFgRm83mttdNS0sjOjqa/fv36xpmpYT+TUoX/XuULvr3KF3073FphmFw8uRJoqKisNvzHgmkM0KXYLfbqVGjRrG9fnBwsP6PuJTRv0npon+P0kX/HqWL/j3yl9+ZoPM0WFpERES8loqQiIiIeC0VIYv4+/szevRo/P39rY4if9G/Semif4/SRf8epYv+PdxHg6VFRETEa+mMkIiIiHgtFSERERHxWipCIiIi4rVUhERERMRrqQhZ5J133iEmJoaAgABatWrF6tWrrY7klRISEmjZsiUVK1YkIiKCbt26sXPnTqtjyV9efvllbDYbw4YNszqKVzt48CD/+Mc/qFy5MoGBgTRp0oS1a9daHcsrZWdnM2rUKGrXrk1gYCB169Zl3Lhxl7yeluRNRcgCM2bMYPjw4YwePZr169fTrFkzunTpwpEjR6yO5nWWLFnCo48+ys8//8z8+fM5d+4cN954I+np6VZH83pr1qzh/fffp2nTplZH8Wp//vknbdu2pVy5cvzwww9s27aNN954g0qVKlkdzSu98sorvPfee0yaNInt27fzyiuv8Oqrr/L2229bHc1jafq8BVq1akXLli2ZNGkSYF7PLDo6msGDBzNixAiL03m3o0ePEhERwZIlS+jQoYPVcbzWqVOnuOaaa3j33Xd54YUXaN68ORMmTLA6llcaMWIEK1asYNmyZVZHEeDWW28lMjKSjz76yLntrrvuIjAwkE8//dTCZJ5LZ4RKWGZmJuvWrSM+Pt65zW63Ex8fT2JiooXJBCA1NRWAsLAwi5N4t0cffZRbbrnF5f9PxBqzZ88mNjaWu+++m4iICK6++mqmTJlidSyv1aZNGxYsWMCuXbsA2LRpE8uXL+fmm2+2OJnn0kVXS9ixY8fIzs4mMjLSZXtkZCQ7duywKJWAeWZu2LBhtG3blsaNG1sdx2t98cUXrF+/njVr1lgdRYDdu3fz3nvvMXz4cJ5++mnWrFnDkCFD8PPzo2/fvlbH8zojRowgLS2N+vXr4+PjQ3Z2Ni+++CK9e/e2OprHUhES+cujjz7Kli1bWL58udVRvNb+/fsZOnQo8+fPJyAgwOo4gvkfCLGxsbz00ksAXH311WzZsoXJkyerCFngyy+/ZPr06Xz22Wc0atSIjRs3MmzYMKKiovTvUUQqQiWsSpUq+Pj4kJKS4rI9JSWFqlWrWpRKBg0axJw5c1i6dCk1atSwOo7XWrduHUeOHOGaa65xbsvOzmbp0qVMmjSJs2fP4uPjY2FC71OtWjUaNmzosq1BgwZ89dVXFiXybk8++SQjRozg3nvvBaBJkyb8/vvvJCQkqAgVkcYIlTA/Pz9atGjBggULnNscDgcLFiygdevWFibzToZhMGjQIL755hsWLlxI7dq1rY7k1eLi4ti8eTMbN2503mJjY+nduzcbN25UCbJA27ZtcywpsWvXLmrVqmVRIu+WkZGB3e76p9vHxweHw2FRIs+nM0IWGD58OH379iU2NpZrr72WCRMmkJ6eTr9+/ayO5nUeffRRPvvsM7777jsqVqxIcnIyACEhIQQGBlqczvtUrFgxx/is8uXLU7lyZY3bsshjjz1GmzZteOmll7jnnntYvXo1H3zwAR988IHV0bzSbbfdxosvvkjNmjVp1KgRGzZs4M033+TBBx+0OprH0vR5i0yaNInXXnuN5ORkmjdvzltvvUWrVq2sjuV1bDZbrts//vhjHnjggZINI7nq1KmTps9bbM6cOYwcOZJff/2V2rVrM3z4cB566CGrY3mlkydPMmrUKL755huOHDlCVFQUvXr14rnnnsPPz8/qeB5JRUhERES8lsYIiYiIiNdSERIRERGvpSIkIiIiXktFSERERLyWipCIiIh4LRUhERER8VoqQiIiIuK1VIREJFedOnVi2LBhVsfIwWaz8e2331odo9iMGTOG5s2bWx1DxGuoCIlIrr7++mvGjRvnfBwTE1OiqzvnVQgOHz7MzTffXGI5RKRs07XGRCRXYWFhxfK6mZmZl3UpgKpVq7oxjfc4d+4c5cqVszqGSKmjM0Iikqu/fzXWqVMnfv/9dx577DFsNpvLNdqWL19O+/btCQwMJDo6miFDhpCenu58PiYmhnHjxtGnTx+Cg4MZOHAgAP/617+48sorCQoKok6dOowaNYpz584BMHXqVMaOHcumTZuc7zd16lQg51djmzdvpnPnzgQGBlK5cmUGDhzIqVOnnM8/8MADdOvWjddff51q1apRuXJlHn30Ued75eb82ahPPvmEmJgYQkJCuPfeezl58qTL57r4DFnz5s0ZM2aM87HNZuP999/n1ltvJSgoiAYNGpCYmMhvv/1Gp06dKF++PG3atCEpKSlHhvfff5/o6GiCgoK45557SE1NdXn+ww8/pEGDBgQEBFC/fn3effdd53N79+7FZrMxY8YMOnbsSEBAANOnT8/z84p4MxUhEbmkr7/+mho1avD8889z+PBhDh8+DEBSUhI33XQTd911F7/88gszZsxg+fLlDBo0yOX4119/nWbNmrFhwwZGjRoFmFeanzp1Ktu2bWPixIlMmTKF8ePHA9CzZ08ef/xxGjVq5Hy/nj175siVnp5Oly5dqFSpEmvWrGHmzJn89NNPOd5/0aJFJCUlsWjRIqZNm8bUqVOdxSovSUlJfPvtt8yZM4c5c+awZMkSXn755UL/7s6XwI0bN1K/fn3uu+8+Hn74YUaOHMnatWsxDCNH3t9++40vv/yS//73v8ybN48NGzbwz3/+0/n89OnTee6553jxxRfZvn07L730EqNGjWLatGkurzNixAiGDh3K9u3b6dKlS6Gzi3gFQ0QkFx07djSGDh3qfFyrVi1j/PjxLvv079/fGDhwoMu2ZcuWGXa73Th9+rTzuG7dul3y/V577TWjRYsWzsejR482mjVrlmM/wPjmm28MwzCMDz74wKhUqZJx6tQp5/Pff/+9YbfbjeTkZMMwDKNv375GrVq1jKysLOc+d999t9GzZ888s4wePdoICgoy0tLSnNuefPJJo1WrVs7Huf0+mjVrZowePdol67PPPut8nJiYaADGRx995Nz2+eefGwEBAS7v7ePjYxw4cMC57YcffjDsdrtx+PBhwzAMo27dusZnn33m8t7jxo0zWrdubRiGYezZs8cAjAkTJuT5GUXEpDFCIlJkmzZt4pdffnH52sUwDBwOB3v27KFBgwYAxMbG5jh2xowZvPXWWyQlJXHq1CmysrIIDg4u1Ptv376dZs2aUb58eee2tm3b4nA42LlzJ5GRkQA0atQIHx8f5z7VqlVj8+bN+b52TEwMFStWdDnmyJEjhcoH0LRpU+f983maNGnisu3MmTOkpaU5P3/NmjWpXr26c5/WrVs7P1PFihVJSkqif//+PPTQQ859srKyCAkJcXnv3H7vIuJKRUhEiuzUqVM8/PDDDBkyJMdzNWvWdN7/e1EBSExMpHfv3owdO5YuXboQEhLCF198wRtvvFEsOS8eJGyz2XA4HJd1jN1uxzAMl31yG3f099c5P7Yqt22XynPe+fFPU6ZMoVWrVi7P/b3sQc7fu4jkpCIkIgXi5+dHdna2y7ZrrrmGbdu2Ua9evUK91sqVK6lVqxbPPPOMc9vvv/9+yfe7WIMGDZg6dSrp6enOP/orVqzAbrdz1VVXFSpTYYWHhzvHSgGkpaWxZ88et7z2vn37OHToEFFRUQD8/PPPzs8UGRlJVFQUu3fvpnfv3m55PxFvpsHSIlIgMTExLF26lIMHD3Ls2DHAnPm1cuVKBg0axMaNG/n111/57rvvcgz+vdgVV1zBvn37+OKLL0hKSuKtt97im2++yfF+e/bsYePGjRw7doyzZ8/meJ3evXsTEBBA37592bJlC4sWLWLw4MHcf//9zq+hikvnzp355JNPWLZsGZs3b6Zv3745zsgU1fnPtGnTJpYtW8aQIUO45557nEsHjB07loSEBN566y127drF5s2b+fjjj3nzzTfd8v4i3kRFSEQK5Pnnn2fv3r3UrVuX8PBwwBz/smTJEnbt2kX79u25+uqree6555xnMvJy++2389hjjzFo0CCaN2/OypUrnbPJzrvrrru46aabuP766wkPD+fzzz/P8TpBQUH873//4/jx47Rs2ZIePXoQFxfHpEmT3PfB8zBy5Eg6duzIrbfeyi233EK3bt2oW7euW167Xr16dO/ena5du3LjjTfStGlTl+nxAwYM4MMPP+Tjjz+mSZMmdOzYkalTp1K7dm23vL+IN7EZF3/JLSIiIuIldEZIREREvJaKkIiIiHgtFSERERHxWipCIiIi4rVUhERERMRrqQiJiIiI11IREhEREa+lIiQiIiJeS0VIREREvJaKkIiIiHgtFSERERHxWipCIiIi4rX+H0HDQ1UntDG8AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "df = pd.DataFrame(job.metrics())\n", + "df.sort_values(by=[\"iteration_number\"], inplace=True)\n", + "\n", + "plt.plot(df[\"iteration_number\"], df[\"expval\"], \"-o\", color=\"orange\")\n", + "plt.xlabel(\"iteration number\")\n", + "plt.ylabel(\"expectation value\")\n", + "plt.title(\"Simulator results\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running on a QPU with priority\n", + "\n", + "The next step is to see how well the qubit rotation works on a real QPU. We\n", + "create a hybrid job with the Rigetti device as the priority QPU. We also increase the number of\n", + "steps to 10.\n", + "\n", + "Using hybrid jobs for iterative algorithms is very beneficial because you retain priority access to the\n", + "target QPU. So once your quantum tasks are created in the hybrid job, they run ahead of other tasks\n", + "waiting in the *quantum task queue*. This means your\n", + "algorithm will not be interrupted by other quantum tasks, so it will run more efficiently and\n", + "predictably. Quantum tasks submitted as part of a hybrid job have priority, and are aggregated in the *priority task queue*.\n", + "\n", + "Hybrid jobs have their own *hybrid jobs queue* so that only a single\n", + "hybrid job can run on a QPU at a time. Each QPU has its own hybrid jobs queue. Note that this is a different queue from the quantum tasks. For a single quantum circuit, or a batch of circuit, it’s\n", + "recommended to create quantum tasks instead of hybrid jobs. For more information on quantum tasks and hybrid jobs queue see the [Amazon Braket documentation](https://docs.aws.amazon.com/braket/latest/developerguide/braket-task-when.html).\n", + "\n", + "To get QPU priority, you must ensure that the device ARN used within the function matches that\n", + "specified in the decorator. For convenience, you can use the helper function ``get_device_arn()`` to\n", + "automatically capture the device ARN declared in ``@hybrid_job``.\n", + "\n", + "
\n", + " Note: Only hybrid jobs running on AWS receive priority. Hybrid jobs running locally, or with a mismatched device ARN do not get priority task queueing. \n", + "
\n", + "\n", + "In the previous example, we declared the local simulator outside the decorated function scope.\n", + "However, for AWS devices such as QPUs or on-demand simulators, the device must be declared within the function scope. \n", + "\n", + "
\n", + " Note: AWS devices must be declared within the body of the decorated function.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from braket.devices import Devices\n", + "\n", + "device_arn = Devices.Rigetti.Ankaa2\n", + "\n", + "\n", + "@hybrid_job(device=device_arn) # set priority QPU\n", + "def qpu_qubit_rotation_hybrid_job(num_steps=10, stepsize=0.5):\n", + " # AWS devices must be declared within the decorated function.\n", + " device = qml.device(\n", + " \"braket.aws.qubit\",\n", + " device_arn=device_arn.value, # Make sure the device ARN matches the hybrid job device ARN\n", + " wires=2,\n", + " shots=1_000,\n", + " )\n", + "\n", + " @qml.qnode(device)\n", + " def circuit(params):\n", + " qml.RX(params[0], wires=0)\n", + " qml.RY(params[1], wires=0)\n", + " return qml.expval(qml.PauliZ(0))\n", + "\n", + " opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", + " params = np.array([0.5, 0.75])\n", + "\n", + " for i in range(num_steps):\n", + " # update the circuit parameters\n", + " params = opt.step(circuit, params)\n", + " expval = circuit(params)\n", + "\n", + " log_metric(metric_name=\"expval\", iteration_number=i, value=expval)\n", + "\n", + " return params" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get a sense of how long we will wait before the hybrid job runs, we can check the hybrid job\n", + "queue depth with `AwsDevice(device_arn).queue_depth().jobs`. We can also check if the device is\n", + "currently available with `AwsDevice(device_arn).is_available()`.\n", + "\n", + "You can check the queue depth on the devices page of the [Amazon Braket Console](https://console.aws.amazon.com/braket/home). Below, we show the devices page for Rigetti Ankaa-2.\n", + "\n", + "![Rigetti Ankaa-2 showing the queue depths.](console_figures/queue_viz.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "When there are no other hybrid jobs in the queue ahead of you, and the device is available, the hybrid job will start running.\n", + "\n", + "
\n", + " Note: Running the following cell will only run once the QPU is available. This may take a long time and will result in usage fees charged to your AWS account. Only run the cell if you are comfortable with the potential wait-time and costs. We recommend monitoring the Billing & Cost Management Dashboard on the AWS console.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AwsQuantumJob('arn':'arn:aws:braket:us-west-2:318845237731:job/qpu-qubit-rotation-hybrid-job-1700084458165')\n" + ] + } + ], + "source": [ + "qpu_job = qpu_qubit_rotation_hybrid_job(num_steps=10, stepsize=0.5)\n", + "print(qpu_job)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we wait for the algorithm to complete and download the result. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'result': tensor([0.0205, 3.1065], requires_grad=True)}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qpu_job.result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we plot the expectation value per iteration number below. We see that on a real QPU, the data is not as smooth as the simulator, but the minimum still is detected correctly!" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'timestamp': [1700084730.969484, 1700084698.0504165, 1700084679.9848497, 1700084664.1287766, 1700084648.2972944, 1700084632.2871127, 1700084616.684862], 'expval': [-0.972, -0.784, -0.548, -0.36, -0.07, 0.11, 0.388], 'iteration_number': [7.0, 5.0, 4.0, 3.0, 2.0, 1.0, 0.0]}\n" + ] + } + ], + "source": [ + "# May need to wait a bit before metrics show up\n", + "# If metrics aren't there, try again after 5 seconds\n", + "import time\n", + "\n", + "time.sleep(10)\n", + "print(qpu_job.metrics())" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = pd.DataFrame(qpu_job.metrics())\n", + "df.sort_values(by=[\"iteration_number\"], inplace=True)\n", + "\n", + "plt.plot(df[\"iteration_number\"], df[\"expval\"], \"-o\", color=\"teal\")\n", + "plt.xlabel(\"iteration number\")\n", + "plt.ylabel(\"expectation value\")\n", + "plt.title(\"QPU results\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + " Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. \n", + " Estimated charges shown may differ from your actual charges. \n", + " Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2)\n", + " Estimated cost to run this example is $39 USD.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this tutorial, we showed how to migrate from local Python functions to running algorithms on simulators and QPUs on Amazon Braket.\n", + "We adapted the simple example of rotating a qubit using gradient descent, running this on both a\n", + "local simulator and a real QPU. \n", + "Using Amazon Braket Hybrid Jobs allowed us to run algorithms asynchronously, scale classical compute using AWS, and obtain priority access to the selected QPU for the duration of our algorithm." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_braket", + "language": "python", + "name": "conda_braket" + }, + "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.13" + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs.ipynb b/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs.ipynb index 28fbe678c..435c3cf9e 100644 --- a/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs.ipynb +++ b/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs.ipynb @@ -74,9 +74,10 @@ ], "source": [ "import numpy as np\n", - "from braket.devices import LocalSimulator\n", "from qcbm.qcbm import QCBM\n", "\n", + "from braket.devices import LocalSimulator\n", + "\n", "n_qubits = 3\n", "n_layers = 2\n", "\n", @@ -204,11 +205,12 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.jobs.metrics import log_metric\n", - "from braket.tracking import Tracker\n", "from qcbm.qcbm import mmd_loss\n", "from scipy.optimize import minimize\n", "\n", + "from braket.jobs.metrics import log_metric\n", + "from braket.tracking import Tracker\n", + "\n", "\n", "def train_circuit(n_qubits, n_layers, n_iterations=10):\n", " global iteration_number\n", diff --git a/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/qcbm/qcbm.py b/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/qcbm/qcbm.py index b2f7b2d28..0179e22f5 100644 --- a/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/qcbm/qcbm.py +++ b/examples/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/qcbm/qcbm.py @@ -130,7 +130,7 @@ def compute_kernel(px: np.ndarray, py: np.ndarray, sigma_list=[0.1, 1]): """ x = np.arange(len(px)) y = np.arange(len(py)) - K = sum(np.exp(-np.abs(x[:, None] - y[None, :]) ** 2 / (2 * s**2)) for s in sigma_list) + K = sum(np.exp(-(np.abs(x[:, None] - y[None, :]) ** 2) / (2 * s**2)) for s in sigma_list) kernel = px @ K @ py return kernel diff --git a/examples/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb b/examples/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb index b00980d9a..41877e1bd 100644 --- a/examples/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb +++ b/examples/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb @@ -221,15 +221,14 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.jobs import get_results_dir\n", "from braket.jobs.metrics import log_metric\n", "\n", "\n", "def run_qaoa(p=1, steps=10):\n", " graph = nx.read_adjlist(input_file_path, nodetype=int)\n", - " wires = list(graph.nodes)\n", + " list(graph.nodes)\n", "\n", - " cost_h, mixer_h = qaoa.maxcut(graph)\n", + " cost_h, _mixer_h = qaoa.maxcut(graph)\n", " params = np.random.rand(2, p)\n", "\n", " @qml.qnode(dev)\n", @@ -379,7 +378,7 @@ "\n", " graph = nx.read_adjlist(input_file_path, nodetype=int)\n", " wires = list(graph.nodes)\n", - " cost_h, mixer_h = qaoa.maxcut(graph)\n", + " cost_h, _mixer_h = qaoa.maxcut(graph)\n", "\n", " dev = qml.device(\"default.qubit\", wires=len(wires))\n", "\n", @@ -629,7 +628,6 @@ "\n", "# A demonstration of plotting the metrics\n", "import pandas as pd\n", - "from matplotlib.ticker import MaxNLocator\n", "\n", "df = pd.DataFrame(job.metrics()).sort_values(\"iteration_number\")\n", "\n", @@ -677,7 +675,7 @@ "\n", " graph = nx.read_adjlist(input_file_path, nodetype=int)\n", " wires = list(graph.nodes)\n", - " cost_h, mixer_h = qaoa.maxcut(graph)\n", + " cost_h, _mixer_h = qaoa.maxcut(graph)\n", "\n", " dev = qml.device(\"default.qubit\", wires=len(wires))\n", "\n", diff --git a/examples/hybrid_jobs/3_Bring_your_own_container/algorithm_script.py b/examples/hybrid_jobs/3_Bring_your_own_container/algorithm_script.py index 7e6a9e454..eb5ae6a5c 100644 --- a/examples/hybrid_jobs/3_Bring_your_own_container/algorithm_script.py +++ b/examples/hybrid_jobs/3_Bring_your_own_container/algorithm_script.py @@ -4,11 +4,12 @@ import pennylane as qml import spacy_sentence_bert +from pennylane import numpy as np +from pennylane.templates import AmplitudeEmbedding + from braket.jobs import save_job_result from braket.jobs.metrics import log_metric from braket.tracking import Tracker -from pennylane import numpy as np -from pennylane.templates import AmplitudeEmbedding def main(): @@ -134,8 +135,8 @@ def cost_batch(self, *w, data=None, label=None): label (List): A list of labels. """ result = 0 - for d, l in zip(data, label): - result += self.cost(*w, data=d, label=l) + for d, label in zip(data, label): + result += self.cost(*w, data=d, label=label) return result / len(data) def cost(self, *w, data=None, label=None): diff --git a/examples/hybrid_jobs/3_Bring_your_own_container/bring_your_own_container.ipynb b/examples/hybrid_jobs/3_Bring_your_own_container/bring_your_own_container.ipynb index 1db8d220f..5a7b6e1ed 100644 --- a/examples/hybrid_jobs/3_Bring_your_own_container/bring_your_own_container.ipynb +++ b/examples/hybrid_jobs/3_Bring_your_own_container/bring_your_own_container.ipynb @@ -73,10 +73,11 @@ "import spacy_sentence_bert\n", "\n", "nlp = spacy_sentence_bert.load_model(\"xx_distiluse_base_multilingual_cased_v2\")\n", - "banana_string = [\"I eat a banana every day.\",\n", - " \"Bananas are not for her.\",\n", - " \"Banana shakes are delicious.\",\n", - " \"How can you like bananas?\"\n", + "banana_string = [\n", + " \"I eat a banana every day.\",\n", + " \"Bananas are not for her.\",\n", + " \"Banana shakes are delicious.\",\n", + " \"How can you like bananas?\",\n", "]\n", "banana_embedding = [nlp(d) for d in banana_string]\n", "data = [d.vector for d in banana_embedding]\n", @@ -110,7 +111,7 @@ ], "source": [ "for d in data:\n", - " print(\"data size: {}\".format(d.shape)) " + " print(\"data size: {}\".format(d.shape))" ] }, { @@ -363,9 +364,13 @@ ], "source": [ "print(\"Quantum Task Summary\")\n", - "print(job.result()['task summary'])\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run quantum tasks in this hybrid job: {job.result()['estimated cost']} USD\")" + "print(job.result()[\"task summary\"])\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run quantum tasks in this hybrid job: {job.result()['estimated cost']} USD\"\n", + ")" ] }, { @@ -386,8 +391,8 @@ "source": [ "from algorithm_script import CCQC\n", "\n", - "device=Devices.Amazon.SV1\n", - "qml_model=CCQC(nwires = 9, device=device)" + "device = Devices.Amazon.SV1\n", + "qml_model = CCQC(nwires=9, device=device)" ] }, { @@ -405,7 +410,7 @@ "metadata": {}, "outputs": [], "source": [ - "weights = job.result()['weights']" + "weights = job.result()[\"weights\"]" ] }, { diff --git a/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs.ipynb b/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs.ipynb index 95d8f184c..be454d52d 100644 --- a/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs.ipynb +++ b/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs.ipynb @@ -104,9 +104,9 @@ "metadata": {}, "outputs": [], "source": [ - "hyperparameters={\n", - " \"n_nodes\": 6, \n", - " \"n_edges\": 8, \n", + "hyperparameters = {\n", + " \"n_nodes\": 6,\n", + " \"n_edges\": 8,\n", " \"n_layers\": 3,\n", " \"iterations\": 10,\n", " \"stepsize\": 0.1,\n", @@ -163,7 +163,7 @@ "source": [ "from braket.jobs.config import InstanceConfig\n", "\n", - "instance_config = InstanceConfig(instanceType='ml.m5.large')" + "instance_config = InstanceConfig(instanceType=\"ml.m5.large\")" ] }, { @@ -181,9 +181,9 @@ "metadata": {}, "outputs": [], "source": [ - "device=\"local:braket/braket.local.qubit\" # Using Braket local simulator\n", + "device = \"local:braket/braket.local.qubit\" # Using Braket local simulator\n", "# device=\"local:pennylane/default.qubit\" # Using Pennylane default.qubit simulator\n", - "# device=\"arn:aws:braket:::device/quantum-simulator/amazon/sv1\" # Using Braket on-demand SV1 " + "# device=\"arn:aws:braket:::device/quantum-simulator/amazon/sv1\" # Using Braket on-demand SV1" ] }, { @@ -210,6 +210,7 @@ "outputs": [], "source": [ "import time\n", + "\n", "from braket.aws import AwsQuantumJob\n", "\n", "job = AwsQuantumJob.create(\n", @@ -261,9 +262,9 @@ "metadata": {}, "outputs": [], "source": [ - "hyperparameters={\n", - " \"n_nodes\": 6, \n", - " \"n_edges\": 8, \n", + "hyperparameters = {\n", + " \"n_nodes\": 6,\n", + " \"n_edges\": 8,\n", " \"n_layers\": 3,\n", " \"iterations\": 10,\n", " \"stepsize\": 0.1,\n", @@ -329,7 +330,7 @@ "metadata": {}, "outputs": [], "source": [ - "instance_config = InstanceConfig(instanceType='ml.p3.2xlarge')" + "instance_config = InstanceConfig(instanceType=\"ml.p3.2xlarge\")" ] }, { @@ -347,9 +348,9 @@ "metadata": {}, "outputs": [], "source": [ - "hyperparameters={\n", - " \"n_nodes\": 22, \n", - " \"n_edges\": 150, \n", + "hyperparameters = {\n", + " \"n_nodes\": 22,\n", + " \"n_edges\": 150,\n", " \"n_layers\": 3,\n", " \"iterations\": 1,\n", " \"stepsize\": 0.1,\n", @@ -422,9 +423,9 @@ "metadata": {}, "outputs": [], "source": [ - "hyperparameters={\n", - " \"n_nodes\": 6, \n", - " \"n_edges\": 8, \n", + "hyperparameters = {\n", + " \"n_nodes\": 6,\n", + " \"n_edges\": 8,\n", " \"n_layers\": 3,\n", " \"iterations\": 10,\n", " \"stepsize\": 0.1,\n", diff --git a/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/qaoa_algorithm.py b/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/qaoa_algorithm.py index 9b4972d80..b03d33af4 100644 --- a/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/qaoa_algorithm.py +++ b/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/qaoa_algorithm.py @@ -1,26 +1,24 @@ -import networkx as nx -import os import json +import os -from braket.jobs import save_job_result -from braket.jobs.metrics import log_metric - +import networkx as nx import pennylane as qml from pennylane import numpy as np - from qaoa.utils import get_device +from braket.jobs import save_job_result +from braket.jobs.metrics import log_metric + -def main(): +def main(): ########## Read environment variables ########## hp_file = os.environ["AMZN_BRAKET_HP_FILE"] - ########## Hyperparameters ########## with open(hp_file, "r") as f: hyperparams = json.load(f) print("hyperparams: ", hyperparams) - + # problem-setup hyperparams n_nodes = int(hyperparams["n_nodes"]) n_edges = float(hyperparams["n_edges"]) @@ -31,24 +29,23 @@ def main(): iterations = int(hyperparams["iterations"]) stepsize = float(hyperparams["stepsize"]) diff_method = hyperparams["diff_method"] - + ########## Device ########## device = get_device(n_nodes) - ########## Set up graph ########## g = nx.gnm_random_graph(n_nodes, n_edges, seed=seed) - positions = nx.spring_layout(g, seed=seed) + nx.spring_layout(g, seed=seed) cost_h, mixer_h = qml.qaoa.max_clique(g, constrained=False) - print('number of observables: ', len(cost_h._ops)) + print("number of observables: ", len(cost_h._ops)) def qaoa_layer(gamma, alpha): qml.qaoa.cost_layer(gamma, cost_h) qml.qaoa.mixer_layer(alpha, mixer_h) - + def circuit(params): - for i in range(n_nodes): + for i in range(n_nodes): qml.Hadamard(wires=i) qml.layer(qaoa_layer, n_layers, params[0], params[1]) @@ -56,7 +53,6 @@ def circuit(params): def cost_function(params): circuit(params) return qml.expval(cost_h) - ########## Optimization ########### print("start optimizing...") @@ -64,10 +60,10 @@ def cost_function(params): params = np.random.uniform(size=[2, n_layers]) opt = qml.AdamOptimizer(stepsize=stepsize) - + for i in range(iterations): params, cost_before = opt.step_and_cost(cost_function, params) - + # Log the loss before the update step as a metric log_metric( metric_name="Cost", @@ -75,14 +71,13 @@ def cost_function(params): iteration_number=i, ) - final_cost = float(cost_function(params)) log_metric( metric_name="Cost", value=final_cost, iteration_number=iterations, ) - + save_job_result({"params": params.tolist(), "cost": final_cost}) diff --git a/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/utils.py b/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/utils.py index 6b31918cf..3ac8db9d5 100644 --- a/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/utils.py +++ b/examples/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/qaoa/utils.py @@ -1,23 +1,29 @@ -import pennylane as qml import os +import pennylane as qml + + def get_device(n_wires): device_string = os.environ["AMZN_BRAKET_DEVICE_ARN"] device_prefix = device_string.split(":")[0] - if device_prefix=="local": - prefix, device_name = device_string.split("/") - device = qml.device(device_name, - wires=n_wires, - custom_decomps={"MultiRZ": qml.MultiRZ.compute_decomposition}) + if device_prefix == "local": + _prefix, device_name = device_string.split("/") + device = qml.device( + device_name, + wires=n_wires, + custom_decomps={"MultiRZ": qml.MultiRZ.compute_decomposition}, + ) print("Using local simulator: ", device.name) else: - device = qml.device('braket.aws.qubit', - device_arn=device_string, - s3_destination_folder=None, - wires=n_wires, - parallel=True, - max_parallel=30) + device = qml.device( + "braket.aws.qubit", + device_arn=device_string, + s3_destination_folder=None, + wires=n_wires, + parallel=True, + max_parallel=30, + ) print("Using AWS managed device: ", device.name) - - return device \ No newline at end of file + + return device diff --git a/examples/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML.ipynb b/examples/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML.ipynb index 813f01d8b..89ff8f08c 100644 --- a/examples/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML.ipynb +++ b/examples/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML.ipynb @@ -55,20 +55,21 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.jobs.config import InstanceConfig\n", "from braket.aws import AwsSession\n", + "from braket.jobs.config import InstanceConfig\n", "from braket.jobs.image_uris import Framework, retrieve_image\n", "\n", - "instance_config = InstanceConfig(instanceType='ml.p3.2xlarge')\n", + "instance_config = InstanceConfig(instanceType=\"ml.p3.2xlarge\")\n", "\n", - "hyperparameters={\"nwires\": 10, \n", - " \"ndata\": 64, \n", - " \"batch_size\": 64, \n", - " \"epochs\": 5, \n", - " \"gamma\": 0.99, \n", - " \"lr\": 0.1,\n", - " \"seed\": 42,\n", - " }\n", + "hyperparameters = {\n", + " \"nwires\": 10,\n", + " \"ndata\": 64,\n", + " \"batch_size\": 64,\n", + " \"epochs\": 5,\n", + " \"gamma\": 0.99,\n", + " \"lr\": 0.1,\n", + " \"seed\": 42,\n", + "}\n", "\n", "input_file_path = \"data/sonar.all-data\"\n", "\n", @@ -99,6 +100,7 @@ "outputs": [], "source": [ "import time\n", + "\n", "from braket.aws import AwsQuantumJob\n", "\n", "job = AwsQuantumJob.create(\n", @@ -302,20 +304,21 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.jobs.config import InstanceConfig\n", "from braket.aws import AwsSession\n", + "from braket.jobs.config import InstanceConfig\n", "from braket.jobs.image_uris import Framework, retrieve_image\n", "\n", - "instance_config = InstanceConfig(instanceType='ml.p3.16xlarge')\n", + "instance_config = InstanceConfig(instanceType=\"ml.p3.16xlarge\")\n", "\n", - "hyperparameters={\"nwires\": 10, \n", - " \"ndata\": 64, \n", - " \"batch_size\": 64, \n", - " \"epochs\": 5, \n", - " \"gamma\": 0.99, \n", - " \"lr\": 0.1,\n", - " \"seed\": 42,\n", - " }\n", + "hyperparameters = {\n", + " \"nwires\": 10,\n", + " \"ndata\": 64,\n", + " \"batch_size\": 64,\n", + " \"epochs\": 5,\n", + " \"gamma\": 0.99,\n", + " \"lr\": 0.1,\n", + " \"seed\": 42,\n", + "}\n", "\n", "input_file_path = \"data/sonar.all-data\"\n", "\n", @@ -346,6 +349,7 @@ "outputs": [], "source": [ "import time\n", + "\n", "from braket.aws import AwsQuantumJob\n", "\n", "job = AwsQuantumJob.create(\n", @@ -404,7 +408,7 @@ "metadata": {}, "outputs": [], "source": [ - "instance_config = InstanceConfig(instanceType='ml.p3.16xlarge', instanceCount=2)" + "instance_config = InstanceConfig(instanceType=\"ml.p3.16xlarge\", instanceCount=2)" ] }, { @@ -424,18 +428,19 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.jobs.config import InstanceConfig\n", "from braket.aws import AwsSession\n", + "from braket.jobs.config import InstanceConfig\n", "from braket.jobs.image_uris import Framework, retrieve_image\n", "\n", - "hyperparameters={\"nwires\": 10, \n", - " \"ndata\": 64, \n", - " \"batch_size\": 64, \n", - " \"epochs\": 5, \n", - " \"gamma\": 0.99, \n", - " \"lr\": 0.1,\n", - " \"seed\": 42,\n", - " }\n", + "hyperparameters = {\n", + " \"nwires\": 10,\n", + " \"ndata\": 64,\n", + " \"batch_size\": 64,\n", + " \"epochs\": 5,\n", + " \"gamma\": 0.99,\n", + " \"lr\": 0.1,\n", + " \"seed\": 42,\n", + "}\n", "\n", "input_file_path = \"data/sonar.all-data\"\n", "\n", @@ -466,6 +471,7 @@ "outputs": [], "source": [ "import time\n", + "\n", "from braket.aws import AwsQuantumJob\n", "\n", "job = AwsQuantumJob.create(\n", diff --git a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/helper_funs.py b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/helper_funs.py index 6673aea2a..9a2b392d1 100644 --- a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/helper_funs.py +++ b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/helper_funs.py @@ -1,7 +1,8 @@ -import torch -import numpy as np import csv + +import numpy as np import pennylane as qml +import torch def read_csv_raw(fname): @@ -15,47 +16,48 @@ def read_csv_raw(fname): class Dataset(torch.utils.data.Dataset): - 'Characterizes a dataset for PyTorch' - def __init__(self, data, label): - 'Initialization' + "Characterizes a dataset for PyTorch" + + def __init__(self, data, label): + "Initialization" self.data = data self.label = label - def __len__(self): - 'Denotes the total number of samples' + def __len__(self): + "Denotes the total number of samples" return len(self.label) - def __getitem__(self, index): - 'Generates one sample of data' + def __getitem__(self, index): + "Generates one sample of data" # Load data and get label x = self.data[index] y = self.label[index] return x, y -def sonar_dataset(ndata, input_dir): - raw_data = read_csv_raw(f"{input_dir}/input-data/sonar.all-data") - data = [] - label = [] - for data_point in raw_data: - data.append([float(element) for element in data_point[0:-1]]) - one_label = 1 if data_point[-1]=="M" else -1 - label.append(one_label) +def sonar_dataset(ndata, input_dir): + raw_data = read_csv_raw(f"{input_dir}/input-data/sonar.all-data") + data = [] + label = [] + for data_point in raw_data: + data.append([float(element) for element in data_point[0:-1]]) + one_label = 1 if data_point[-1] == "M" else -1 + label.append(one_label) + + idx = np.random.permutation(208) + data = np.array(data)[idx[0:ndata]].astype("float32") + label = np.array(label)[idx[0:ndata]].astype("float32") - idx = np.random.permutation(208) - data = np.array(data)[idx[0:ndata]].astype('float32') - label = np.array(label)[idx[0:ndata]].astype('float32') + train_dataset = Dataset(data=data, label=label) - train_dataset = Dataset(data=data, label=label) + return train_dataset - return train_dataset - def get_device(n_wires, device_string): device_prefix = device_string.split(":")[0] - if device_prefix=="local": - prefix, device_name = device_string.split("/") + if device_prefix == "local": + _prefix, device_name = device_string.split("/") device = qml.device(device_name, wires=n_wires) print("Using local simulator: ", device.name) else: @@ -65,8 +67,8 @@ def get_device(n_wires, device_string): s3_destination_folder=None, wires=n_wires, parallel=True, - max_parallel=30 + max_parallel=30, ) print("Using AWS managed device: ", device.name) - - return device \ No newline at end of file + + return device diff --git a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/model.py b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/model.py index 235c8717c..4fe88eb33 100644 --- a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/model.py +++ b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/model.py @@ -1,9 +1,7 @@ -import torch -import torch.nn as nn import numpy as np - import pennylane as qml - +import torch +import torch.nn as nn from qml_script.quantum_circuit import QuantumCircuit @@ -17,19 +15,22 @@ def __init__(self, qc_dev): self.w2 = nn.Parameter(weights[1]) self.rot = nn.Parameter(weights[2]) self.circuit = q_circuit.q_circuit() - - self.qlayer = qml.qnn.TorchLayer(self.circuit, {"w_layer1": self.w1.shape, - "w_layer2": self.w2.shape, - "rotation": self.rot.shape, - } - ) + + self.qlayer = qml.qnn.TorchLayer( + self.circuit, + { + "w_layer1": self.w1.shape, + "w_layer2": self.w2.shape, + "rotation": self.rot.shape, + }, + ) self.input_layer = nn.Linear(60, nwires) self.output_layer = nn.Linear(1, 1) def forward(self, x): x = self.input_layer(x) - x = (torch.sigmoid(x)-0.5) * 2 * np.pi + x = (torch.sigmoid(x) - 0.5) * 2 * np.pi x = self.qlayer(x) x = self.output_layer(x) x = torch.squeeze(x) - return x \ No newline at end of file + return x diff --git a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/quantum_circuit.py b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/quantum_circuit.py index 77641920e..d5c33e70c 100644 --- a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/quantum_circuit.py +++ b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/quantum_circuit.py @@ -1,8 +1,6 @@ -import os -import numpy as np import pennylane as qml -from pennylane.templates import AngleEmbedding import torch +from pennylane.templates import AngleEmbedding class QuantumCircuit: @@ -15,8 +13,7 @@ def __init__(self, qc_dev): self.nwires = len(qc_dev.wires) def q_circuit(self): - """Quantum circuit - """ + """Quantum circuit""" nwires = self.nwires qc_dev = self.qc_dev @@ -32,9 +29,9 @@ def circuit(inputs, w_layer1, w_layer2, rotation): def initialize_weights(self): """Initialize the weights in CCQC quantum circuit.""" - w_layer1 = torch.randn((2, self.nwires, 3), dtype=torch.float64) - w_layer2 = torch.randn((2, self.nwires, 3), dtype=torch.float64) - rotation = torch.randn((3,), dtype=torch.float64) + w_layer1 = torch.randn((2, self.nwires, 3), dtype=torch.float64) + w_layer2 = torch.randn((2, self.nwires, 3), dtype=torch.float64) + rotation = torch.randn((3,), dtype=torch.float64) weights = [w_layer1, w_layer2, rotation] return weights @@ -54,4 +51,4 @@ def _entangle_layer(self, p1, p2, rng): for _, params in zip(wirelist, p2): wire2 = (wire1 - rng) % self.nwires qml.CRot.compute_decomposition(params[0], params[1], params[2], wires=[wire1, wire2]) - wire1 = wire2 \ No newline at end of file + wire1 = wire2 diff --git a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_dp.py b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_dp.py index 2dbb93fd8..e02a44a66 100644 --- a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_dp.py +++ b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_dp.py @@ -1,41 +1,37 @@ -import os -import numpy as np import json -import pennylane as qml +import os -from braket.jobs import save_job_result -from braket.jobs.metrics import log_metric +import numpy as np +# Import SMDataParallel PyTorch Modules +import smdistributed.dataparallel.torch.distributed as dist import torch -import torch.nn as nn import torch.nn.functional as F import torch.optim as optim -from torch.optim.lr_scheduler import StepLR - -# Network definition -from qml_script.model import DressedQNN # Dataset -from qml_script.helper_funs import sonar_dataset, get_device +from qml_script.helper_funs import get_device, sonar_dataset -# Import SMDataParallel PyTorch Modules -import smdistributed.dataparallel.torch.distributed as dist +# Network definition +from qml_script.model import DressedQNN from smdistributed.dataparallel.torch.parallel.distributed import DistributedDataParallel as DDP +from torch.optim.lr_scheduler import StepLR +from braket.jobs import save_job_result +from braket.jobs.metrics import log_metric def main(): - input_dir = os.environ["AMZN_BRAKET_INPUT_DIR"] + input_dir = os.environ["AMZN_BRAKET_INPUT_DIR"] output_dir = os.environ["AMZN_BRAKET_JOB_RESULTS_DIR"] hp_file = os.environ["AMZN_BRAKET_HP_FILE"] qc_dev_string = os.environ["AMZN_BRAKET_DEVICE_ARN"] - ########## Hyperparameters ########## with open(hp_file, "r") as f: hyperparams = json.load(f) print("hyperparams: ", hyperparams) - + nwires = int(hyperparams["nwires"]) ndata = int(hyperparams["ndata"]) batch_size = int(hyperparams["batch_size"]) @@ -43,10 +39,9 @@ def main(): gamma = float(hyperparams["gamma"]) lr = float(hyperparams["lr"]) seed = int(hyperparams["seed"]) - + torch.manual_seed(seed) np.random.seed(seed) - ########## DP setup ########## dist.init_process_group() @@ -59,15 +54,12 @@ def main(): batch_size = max(batch_size, 1) print("dp_info: ", dp_info) - ########## Dataset ########## train_dataset = sonar_dataset(ndata, input_dir) - + # Create sampler for distributed training train_sampler = torch.utils.data.distributed.DistributedSampler( - train_dataset, - num_replicas=dp_info["world_size"], - rank=dp_info["rank"] + train_dataset, num_replicas=dp_info["world_size"], rank=dp_info["rank"] ) train_loader = torch.utils.data.DataLoader( train_dataset, @@ -75,19 +67,18 @@ def main(): shuffle=False, num_workers=0, pin_memory=True, - sampler=train_sampler, + sampler=train_sampler, ) - ########## quantum model ########## qc_dev = get_device(nwires, qc_dev_string) qc_dev_name = qc_dev.short_name - + if qc_dev_name == "lightning.gpu": device = torch.device("cuda") else: device = torch.device("cpu") - + model = DressedQNN(qc_dev).to(device) model = DDP(model) torch.cuda.set_device(dp_info["local_rank"]) @@ -96,17 +87,11 @@ def main(): optimizer = optim.Adam(model.parameters(), lr=lr) scheduler = StepLR(optimizer, step_size=1, gamma=gamma) - ########## Optimization ########## for epoch in range(1, epochs + 1): - loss_before = train(dp_info, - model, - device, - train_loader, - optimizer, - epoch) + loss_before = train(dp_info, model, device, train_loader, optimizer, epoch) scheduler.step() - + # Log the loss before the update step as a metric if dp_info["rank"] == 0: log_metric( @@ -115,11 +100,11 @@ def main(): iteration_number=epoch, ) - if dp_info["rank"] == 0: + if dp_info["rank"] == 0: print("Training Finished!!") torch.save(model.state_dict(), f"{output_dir}/test_local.pt") save_job_result({"last loss": float(loss_before.detach().cpu())}) - + def train(dp_info, model, device, train_loader, optimizer, epoch): model.train() @@ -143,9 +128,9 @@ def train(dp_info, model, device, train_loader, optimizer, epoch): loss.item(), ) ) - + return loss if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_single.py b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_single.py index 9dc9da1a4..5b7a7f2c5 100644 --- a/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_single.py +++ b/examples/hybrid_jobs/5_Parallelize_training_for_QML/qml_script/train_single.py @@ -1,36 +1,33 @@ -import os -import numpy as np import json -import pennylane as qml - -from braket.jobs import save_job_result -from braket.jobs.metrics import log_metric +import os +import numpy as np import torch -import torch.nn as nn import torch.nn.functional as F import torch.optim as optim -from torch.optim.lr_scheduler import StepLR + +# Dataset +from qml_script.helper_funs import get_device, sonar_dataset # Network definition from qml_script.model import DressedQNN +from torch.optim.lr_scheduler import StepLR -# Dataset -from qml_script.helper_funs import sonar_dataset, get_device - +from braket.jobs import save_job_result +from braket.jobs.metrics import log_metric def main(): - input_dir = os.environ["AMZN_BRAKET_INPUT_DIR"] + input_dir = os.environ["AMZN_BRAKET_INPUT_DIR"] output_dir = os.environ["AMZN_BRAKET_JOB_RESULTS_DIR"] hp_file = os.environ["AMZN_BRAKET_HP_FILE"] device_string = os.environ["AMZN_BRAKET_DEVICE_ARN"] - + ########## Hyperparameters ########## with open(hp_file, "r") as f: hyperparams = json.load(f) print("hyperparams: ", hyperparams) - + nwires = int(hyperparams["nwires"]) ndata = int(hyperparams["ndata"]) batch_size = int(hyperparams["batch_size"]) @@ -38,14 +35,13 @@ def main(): gamma = float(hyperparams["gamma"]) lr = float(hyperparams["lr"]) seed = int(hyperparams["seed"]) - + torch.manual_seed(seed) np.random.seed(seed) - ########## Dataset ########## train_dataset = sonar_dataset(ndata, input_dir) - + train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=batch_size, @@ -54,39 +50,36 @@ def main(): pin_memory=True, ) - ########## quantum model ########## qc_dev = get_device(nwires, device_string) qc_dev_name = qc_dev.short_name - + if qc_dev_name == "lightning.gpu": device = torch.device("cuda") else: device = torch.device("cpu") - + model = DressedQNN(qc_dev).to(device) optimizer = optim.Adam(model.parameters(), lr=lr) scheduler = StepLR(optimizer, step_size=1, gamma=gamma) - ########## Optimization ########## for epoch in range(1, epochs + 1): loss_before = train(model, device, train_loader, optimizer, epoch) scheduler.step() - + # Log the loss before the update step as a metric log_metric( metric_name="Loss", value=loss_before, iteration_number=epoch, ) - + torch.save(model.state_dict(), f"{output_dir}/test_local.pt") save_job_result({"last loss": float(loss_before.detach().cpu())}) - def train(model, device, train_loader, optimizer, epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): @@ -96,7 +89,7 @@ def train(model, device, train_loader, optimizer, epoch): output = model(data) loss = F.margin_ranking_loss(output, torch.zeros_like(output), target, margin=0.1) - + loss.backward() optimizer.step() print( @@ -108,9 +101,9 @@ def train(model, device, train_loader, optimizer, epoch): loss.item(), ) ) - + return loss - + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/qnspsa_with_embedded_simulator.ipynb b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/qnspsa_with_embedded_simulator.ipynb index a158801e8..71006cf21 100644 --- a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/qnspsa_with_embedded_simulator.ipynb +++ b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/qnspsa_with_embedded_simulator.ipynb @@ -110,19 +110,18 @@ ], "source": [ "# import dependencies\n", - "import pennylane as qml\n", + "import time\n", + "\n", "import networkx as nx\n", + "import pennylane as qml\n", "from matplotlib import pyplot as plt\n", - "from pennylane import qaoa\n", "from pennylane import numpy as np\n", + "from pennylane import qaoa\n", + "\n", "import braket._sdk as braket_sdk\n", + "from braket.aws import AwsQuantumJob, AwsSession\n", "from braket.jobs.image_uris import Framework, retrieve_image\n", "from braket.jobs.local.local_job import LocalQuantumJob\n", - "from braket.aws import AwsQuantumTask, AwsSession, AwsQuantumJob\n", - "from braket.jobs.config import InstanceConfig\n", - "import time\n", - "import boto3\n", - "import matplotlib.pyplot as plt\n", "\n", "# check package versions\n", "print(\"Current pennylane version\", qml.__version__)\n", @@ -215,24 +214,27 @@ "# Defining device to be the pennylane lightning local simulator\n", "dev = qml.device(\"lightning.qubit\", wires=n_qubits)\n", "\n", + "\n", "def qaoa_layer(gamma, alpha):\n", " qaoa.cost_layer(gamma, cost_h)\n", " qaoa.mixer_layer(alpha, mixer_h)\n", - " \n", + "\n", + "\n", "def qaoa_circuit(params, n_qubits, depth):\n", - " #initializing all qubits into +X eigenstate. \n", + " # initializing all qubits into +X eigenstate.\n", " for w in range(n_qubits):\n", " qml.Hadamard(wires=w)\n", " gammas = params[0]\n", " alphas = params[1]\n", - " #stacking building blocks for depth times.\n", + " # stacking building blocks for depth times.\n", " qml.layer(qaoa_layer, depth, gammas, alphas)\n", - " \n", + "\n", + "\n", "# Defining ansatz and cost function\n", "@qml.qnode(dev)\n", "def cost_function(params):\n", " qaoa_circuit(params, n_qubits, depth)\n", - " return qml.expval(cost_h) " + " return qml.expval(cost_h)" ] }, { @@ -277,6 +279,7 @@ "source": [ "# import the QN-SPSA optimizer\n", "from source_scripts.QNSPSA import QNSPSA\n", + "\n", "# Optimize with QN-SPSA\n", "opt = QNSPSA(stepsize=5e-2)\n", "params_init = 2 * np.pi * (np.random.rand(2, depth) - 0.5)\n", @@ -389,7 +392,7 @@ ], "source": [ "%%time\n", - "# This cell should take about 2 min for the first time, \n", + "# This cell should take about 2 min for the first time,\n", "# and about 30 seconds afterward.\n", "\n", "hyperparameters = {\n", @@ -399,7 +402,7 @@ " \"max_iter\": 60,\n", " \"learn_rate\": 1e-2,\n", " \"spsa_repeats\": 2,\n", - " # seed is used to initialize parameters, and to randomly sample \n", + " # seed is used to initialize parameters, and to randomly sample\n", " # the the gate sequence for the ansatz,\n", " \"seed\": 1,\n", " \"optimizer\": \"QNSPSA\",\n", @@ -444,10 +447,10 @@ "# The execution time of the 4 hybrid jobs is about 50 min, and charges about $0.1.\n", "# Feel free to uncomment the cell to run.\n", "\n", - "\"\"\"\n", "n_qubits = 11\n", "optimizers = [\"GD\", \"QNG\", \"QNSPSA\", \"SPSA\"]\n", "repeats = [1, 1, 25, 25]\n", + "\"\"\"\n", "\n", "hyperparameters = {\n", " \"n_qubits\": n_qubits,\n", @@ -506,7 +509,7 @@ } ], "source": [ - "job_arns = [job.arn for job in jobs]\n", + "job_arns = [job.arn for job in jobs] # noqa: F821\n", "print(job_arns)" ] }, @@ -557,15 +560,15 @@ ], "source": [ "step = range(max_iter)\n", - "loss_gd = np.array(results[0]['GD_loss_per_iter'])[0]\n", - "loss_qng = np.array(results[1]['QNG_loss_per_iter'])[0]\n", + "loss_gd = np.array(results[0][\"GD_loss_per_iter\"])[0]\n", + "loss_qng = np.array(results[1][\"QNG_loss_per_iter\"])[0]\n", "\n", - "qnspsa_loss = np.array(results[2]['QNSPSA_loss_per_iter'])\n", + "qnspsa_loss = np.array(results[2][\"QNSPSA_loss_per_iter\"])\n", "qnspsa_loss_mean = np.mean(qnspsa_loss, axis=0)\n", "qnspsa_loss_max = np.max(qnspsa_loss, axis=0)\n", "qnspsa_loss_min = np.min(qnspsa_loss, axis=0)\n", "\n", - "spsa_loss = np.array(results[3]['SPSA_loss_per_iter'])\n", + "spsa_loss = np.array(results[3][\"SPSA_loss_per_iter\"])\n", "spsa_loss_mean = np.mean(spsa_loss, axis=0)\n", "spsa_loss_max = np.max(spsa_loss, axis=0)\n", "spsa_loss_min = np.min(spsa_loss, axis=0)\n", @@ -575,17 +578,25 @@ "fig, ax = plt.subplots()\n", "\n", "ax.plot(\n", - " step, loss_gd, 'b', \n", - " step, loss_qng, 'r', \n", - " step, qnspsa_loss_mean, 'g',\n", - " step, spsa_loss_mean, 'purple',\n", + " step,\n", + " loss_gd,\n", + " \"b\",\n", + " step,\n", + " loss_qng,\n", + " \"r\",\n", + " step,\n", + " qnspsa_loss_mean,\n", + " \"g\",\n", + " step,\n", + " spsa_loss_mean,\n", + " \"purple\",\n", ")\n", "\n", - "ax.plot(step, ground_energy, linestyle='dashed', color='k')\n", + "ax.plot(step, ground_energy, linestyle=\"dashed\", color=\"k\")\n", "\n", - "ax.fill_between(step, qnspsa_loss_min, qnspsa_loss_max, color='g', alpha=.2)\n", - "ax.fill_between(step, spsa_loss_min, spsa_loss_max, color='purple', alpha=.2)\n", - "ax.legend(['GD', 'QNG', 'QN-SPSA', 'SPSA', 'ground energy'])\n", + "ax.fill_between(step, qnspsa_loss_min, qnspsa_loss_max, color=\"g\", alpha=0.2)\n", + "ax.fill_between(step, spsa_loss_min, spsa_loss_max, color=\"purple\", alpha=0.2)\n", + "ax.legend([\"GD\", \"QNG\", \"QN-SPSA\", \"SPSA\", \"ground energy\"])\n", "ax.set_xlabel(\"Step\")\n", "ax.set_ylabel(\"Loss\")\n", "plt.show()" @@ -621,10 +632,10 @@ } ], "source": [ - "print(f'GD takes %.2f s per step' % (results[0]['GD_duration'] / repeats[0] / max_iter))\n", - "print(f'QNG takes %.2f s per step' % (results[1]['QNG_duration'] / repeats[1] / max_iter))\n", - "print(f'QNSPSA takes %.2f s per step' % (results[2]['QNSPSA_duration'] / repeats[2] / max_iter))\n", - "print(f'SPSA takes %.2f s per step' % (results[3]['SPSA_duration'] / repeats[3] / max_iter))" + "print(\"GD takes %.2f s per step\" % (results[0][\"GD_duration\"] / repeats[0] / max_iter))\n", + "print(\"QNG takes %.2f s per step\" % (results[1][\"QNG_duration\"] / repeats[1] / max_iter))\n", + "print(\"QNSPSA takes %.2f s per step\" % (results[2][\"QNSPSA_duration\"] / repeats[2] / max_iter))\n", + "print(\"SPSA takes %.2f s per step\" % (results[3][\"SPSA_duration\"] / repeats[3] / max_iter))" ] }, { @@ -648,12 +659,9 @@ "n_qubits = 10\n", "depth = 2\n", "\n", - "params_init = 2 * np.pi * (np.random.rand(2, depth) - 0.5) \n", - " \n", - "np.save(\n", - " f\"source_scripts/qaoa_params_init_{n_qubits}_qubits_{depth}_layers.npy\", \n", - " params_init\n", - ")" + "params_init = 2 * np.pi * (np.random.rand(2, depth) - 0.5)\n", + "\n", + "np.save(f\"source_scripts/qaoa_params_init_{n_qubits}_qubits_{depth}_layers.npy\", params_init)" ] }, { @@ -733,17 +741,17 @@ } ], "source": [ - "results = [job.result() for job in jobs]\n", + "results = [job.result() for job in jobs] # noqa: F821\n", "step = range(max_iter)\n", - "loss_gd = np.array(results[0]['GD_loss_per_iter'])[0]\n", - "loss_qng = np.array(results[1]['QNG_loss_per_iter'])[0]\n", + "loss_gd = np.array(results[0][\"GD_loss_per_iter\"])[0]\n", + "loss_qng = np.array(results[1][\"QNG_loss_per_iter\"])[0]\n", "\n", - "qnspsa_loss = np.array(results[2]['QNSPSA_loss_per_iter'])\n", + "qnspsa_loss = np.array(results[2][\"QNSPSA_loss_per_iter\"])\n", "qnspsa_loss_mean = np.mean(qnspsa_loss, axis=0)\n", "qnspsa_loss_max = np.max(qnspsa_loss, axis=0)\n", "qnspsa_loss_min = np.min(qnspsa_loss, axis=0)\n", "\n", - "spsa_loss = np.array(results[3]['SPSA_loss_per_iter'])\n", + "spsa_loss = np.array(results[3][\"SPSA_loss_per_iter\"])\n", "spsa_loss_mean = np.mean(spsa_loss, axis=0)\n", "spsa_loss_max = np.max(spsa_loss, axis=0)\n", "spsa_loss_min = np.min(spsa_loss, axis=0)\n", @@ -752,15 +760,23 @@ "fig, ax = plt.subplots()\n", "\n", "ax.plot(\n", - " step, loss_gd, 'b', \n", - " step, loss_qng, 'r', \n", - " step, qnspsa_loss_mean, 'g',\n", - " step, spsa_loss_mean, 'purple',\n", + " step,\n", + " loss_gd,\n", + " \"b\",\n", + " step,\n", + " loss_qng,\n", + " \"r\",\n", + " step,\n", + " qnspsa_loss_mean,\n", + " \"g\",\n", + " step,\n", + " spsa_loss_mean,\n", + " \"purple\",\n", ")\n", "\n", - "ax.fill_between(step, qnspsa_loss_min, qnspsa_loss_max, color='g', alpha=.2)\n", - "#ax.fill_between(step, spsa_loss_min, spsa_loss_max, color='purple', alpha=.2)\n", - "ax.legend(['GD', 'QNG', 'QN-SPSA', 'SPSA'])\n", + "ax.fill_between(step, qnspsa_loss_min, qnspsa_loss_max, color=\"g\", alpha=0.2)\n", + "# ax.fill_between(step, spsa_loss_min, spsa_loss_max, color='purple', alpha=.2)\n", + "ax.legend([\"GD\", \"QNG\", \"QN-SPSA\", \"SPSA\"])\n", "ax.set_xlabel(\"Step\")\n", "ax.set_ylabel(\"Loss\")\n", "plt.show()" @@ -800,10 +816,10 @@ } ], "source": [ - "print(f'GD takes %.2f s per step' % (results[0]['GD_duration'] / repeats[0] / max_iter))\n", - "print(f'QNG takes %.2f s per step' % (results[1]['QNG_duration'] / repeats[1] / max_iter))\n", - "print(f'QNSPSA takes %.2f s per step' % (results[2]['QNSPSA_duration'] / repeats[2] / max_iter))\n", - "print(f'SPSA takes %.2f s per step' % (results[3]['SPSA_duration'] / repeats[3] / max_iter))" + "print(\"GD takes %.2f s per step\" % (results[0][\"GD_duration\"] / repeats[0] / max_iter))\n", + "print(\"QNG takes %.2f s per step\" % (results[1][\"QNG_duration\"] / repeats[1] / max_iter))\n", + "print(\"QNSPSA takes %.2f s per step\" % (results[2][\"QNSPSA_duration\"] / repeats[2] / max_iter))\n", + "print(\"SPSA takes %.2f s per step\" % (results[3][\"SPSA_duration\"] / repeats[3] / max_iter))" ] }, { @@ -908,15 +924,19 @@ } ], "source": [ - "results = job.result()\n", + "results = job.result() # noqa: F821\n", "step = range(60)\n", "\n", - "loss_qnspsa = results['qnspsa_loss_per_iter']\n", + "loss_qnspsa = results[\"qnspsa_loss_per_iter\"]\n", "\n", "fig, ax = plt.subplots()\n", "\n", - "ax.plot(step, loss_qnspsa, 'g',)\n", - "ax.legend(['QN-SPSA'])\n", + "ax.plot(\n", + " step,\n", + " loss_qnspsa,\n", + " \"g\",\n", + ")\n", + "ax.legend([\"QN-SPSA\"])\n", "ax.set_xlabel(\"Step\")\n", "ax.set_ylabel(\"Loss\")\n", "plt.show()" diff --git a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/QNSPSA.py b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/QNSPSA.py index 201a480f1..a2b062966 100644 --- a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/QNSPSA.py +++ b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/QNSPSA.py @@ -1,8 +1,9 @@ import random +import warnings + import pennylane as qml from pennylane import numpy as np from scipy.linalg import sqrtm -import warnings class QNSPSA: @@ -215,16 +216,11 @@ def __get_operations(self, cost, params): def __get_tensor_moving_avg(self, metric_tensor): if self.metric_tensor is None: self.metric_tensor = np.identity(metric_tensor.shape[0]) - return ( - self.k / (self.k + 1) * self.metric_tensor - + 1 / (self.k + 1) * metric_tensor - ) + return self.k / (self.k + 1) * self.metric_tensor + 1 / (self.k + 1) * metric_tensor def __regularize_tensor(self, metric_tensor): tensor_reg = np.real(sqrtm(np.matmul(metric_tensor, metric_tensor))) - return (tensor_reg + self.reg * np.identity(metric_tensor.shape[0])) / ( - 1 + self.reg - ) + return (tensor_reg + self.reg * np.identity(metric_tensor.shape[0])) / (1 + self.reg) def __apply_blocking(self, cost, params_curr, params_next): cost.construct([params_curr], {}) @@ -232,9 +228,7 @@ def __apply_blocking(self, cost, params_curr, params_next): cost.construct([params_next], {}) tape_loss_next = cost.tape.copy(copy_operations=True) - loss_curr, loss_next = qml.execute( - [tape_loss_curr, tape_loss_next], cost.device, None - ) + loss_curr, loss_next = qml.execute([tape_loss_curr, tape_loss_next], cost.device, None) # self.k has been updated earlier ind = (self.k - 2) % self.history_length self.last_n_steps[ind] = loss_curr diff --git a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_qaoa_converge_speed.py b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_qaoa_converge_speed.py index 868731f62..3b75985dc 100644 --- a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_qaoa_converge_speed.py +++ b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_qaoa_converge_speed.py @@ -1,15 +1,16 @@ +import functools +import json import os +import time +import networkx as nx import pennylane as qml from pennylane import numpy as np -import json -from source_scripts.utils import get_device, str2bool, train +from pennylane import qaoa from source_scripts.QNSPSA import QNSPSA +from source_scripts.utils import get_device, str2bool, train + from braket.jobs import save_job_result -import time -import networkx as nx -from pennylane import qaoa -import functools def main(): @@ -92,7 +93,7 @@ def cost(params): print(f"Trace {j}:") opt = opt_choice[optimizer_name](stepsize=lr) - params, loss_per_trace = train( + _params, loss_per_trace = train( opt, max_iter, params_init, diff --git a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_ref_paper_converge_speed.py b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_ref_paper_converge_speed.py index 06961dc8a..a00f5eea2 100644 --- a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_ref_paper_converge_speed.py +++ b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/benchmark_ref_paper_converge_speed.py @@ -1,13 +1,15 @@ -import pennylane as qml -from pennylane import numpy as np -import random +import functools import json import os -from source_scripts.utils import get_device, str2bool, train +import random +import time + +import pennylane as qml +from pennylane import numpy as np from source_scripts.QNSPSA import QNSPSA +from source_scripts.utils import get_device, train + from braket.jobs import save_job_result -import time -import functools def sample_gates(n_qubits, n_layers, seed): @@ -23,13 +25,10 @@ def sample_gates(n_qubits, n_layers, seed): def ansatz_template(params, num_of_wires, sampled_gates, H): if num_of_wires < 2: raise ValueError( - "Number of wires is smaller than 2. " - "The ansatz works on at least two qubits." + "Number of wires is smaller than 2. " "The ansatz works on at least two qubits." ) if num_of_wires != len(sampled_gates): - raise ValueError( - "The length of list wires needs to match" "the length of sampled_gates" - ) + raise ValueError("The length of list wires needs to match" "the length of sampled_gates") m = len(sampled_gates[0]) for k in range(m - 1): for i in range(num_of_wires): @@ -100,7 +99,7 @@ def cost(params): print(f"Trace {j}:") opt = opt_choice[optimizer_name](stepsize=lr) - params, loss_per_trace = train( + _params, loss_per_trace = train( opt, max_iter, params_init, diff --git a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/qaoa_large_problem.py b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/qaoa_large_problem.py index 178349d8a..fa4eac658 100644 --- a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/qaoa_large_problem.py +++ b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/qaoa_large_problem.py @@ -1,14 +1,15 @@ +import json import os +import time + +import networkx as nx import pennylane as qml from pennylane import numpy as np -import json - -from source_scripts.utils import get_device, str2bool, train +from pennylane import qaoa from source_scripts.QNSPSA import QNSPSA +from source_scripts.utils import get_device, str2bool, train + from braket.jobs import save_job_result -import time -import networkx as nx -from pennylane import qaoa def main(): @@ -74,7 +75,7 @@ def cost(params): resamplings=1, blocking=True, ) - params, loss_recording = train( + _params, loss_recording = train( opt_qnspsa, max_iter, params_init, @@ -88,7 +89,6 @@ def cost(params): if __name__ == "__main__": - try: main() print("Training Successful!!") diff --git a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/utils.py b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/utils.py index ae07d57c6..0c0a66d6d 100644 --- a/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/utils.py +++ b/examples/hybrid_jobs/6_QNSPSA_optimizer_with_embedded_simulator/source_scripts/utils.py @@ -1,5 +1,6 @@ -import pennylane as qml import os + +import pennylane as qml from pennylane import numpy as np @@ -8,7 +9,7 @@ def get_device(n_wires, shots): device_prefix = device_string.split(":")[0] if device_prefix == "local": - prefix, device_name = device_string.split("/") + _prefix, device_name = device_string.split("/") if shots == 0: shots = None device = qml.device(device_name, wires=n_wires, shots=shots) diff --git a/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs.ipynb b/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs.ipynb index 3754d0a81..595d35138 100644 --- a/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs.ipynb +++ b/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs.ipynb @@ -100,7 +100,6 @@ "import time\n", "\n", "from braket.aws import AwsQuantumJob\n", - "from braket.jobs.local import LocalQuantumJob\n", "\n", "job = AwsQuantumJob.create(\n", " device=device_arn,\n", diff --git a/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/result/sv1/0_Getting_started_papermill.ipynb b/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/result/sv1/0_Getting_started_papermill.ipynb index 92edbd83d..4c6853694 100644 --- a/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/result/sv1/0_Getting_started_papermill.ipynb +++ b/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/result/sv1/0_Getting_started_papermill.ipynb @@ -94,7 +94,7 @@ "# Parameters\n", "shots = 1000\n", "device_arn = \"arn:aws:braket:::device/quantum-simulator/amazon/sv1\"\n", - "results_dir = \"/opt/braket/model\"\n" + "results_dir = \"/opt/braket/model\"" ] }, { diff --git a/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/notebook_runner.py b/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/notebook_runner.py index ca63c171e..25ae31f3d 100644 --- a/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/notebook_runner.py +++ b/examples/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/src/notebook_runner.py @@ -7,6 +7,8 @@ import pathlib from typing import Any, Dict, TypeVar +import papermill as pm + logging.basicConfig(level="INFO", format="%(message)s") @@ -28,8 +30,6 @@ subprocess.check_call([python, "-m", "pip", "install", *missing]) -import papermill as pm - PathLike = TypeVar("PathLike", str, pathlib.Path, None) diff --git a/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job.ipynb b/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job.ipynb index 908f97dae..8878536f8 100644 --- a/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job.ipynb +++ b/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job.ipynb @@ -1,602 +1,610 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Getting started with Amazon Braket Hybrid Jobs\n", - "\n", - "This tutorial shows how to run your first Amazon Braket Hybrid Job. To get started, we consider small circuits with only one qubit and one gate.\n", - "\n", - "\n", - "## Learning outcomes\n", - "* Get setup to run your first hybrid job\n", - "* Write an algorithm script to run on Braket Hybrid Jobs\n", - "* Understand how to run scripts or functions\n", - "* Create a hybrid job on Braket simulators or QPUs\n", - "* Monitoring the hybrid job state\n", - "* Save results from a hybrid job\n", - "* Using a specific AWS session\n", - "* Running hybrid jobs with priority on QPUs\n", - "* Use local hybrid jobs to quickly test and debug scripts\n", - "* Create a Braket Hybrid Job using the Braket console" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Getting setup to run Braket Hybrid Jobs\n", - "\n", - "When you use Amazon Braket Hybrid Jobs for the first time, you need to create an IAM role with the right [permissions](https://docs.aws.amazon.com/braket/latest/developerguide/braket-manage-access.html#about-amazonbraketjobsexecution). This role allows your hybrid job to perform actions on your behalf while it is executing your algorithm, for instance, access S3 to return the results of your hybrid job. To create the role or check if you already have one please visit the Permissions tab from the left menu of the Braket Console.\n", - "\n", - "## Writing an algorithm script\n", - "\n", - "To create a Braket Hybrid Job, you first need a Python script to run. In this example, it's contained in `algorithm_script.py`. The script is printed in the code cell below for convenience. \n", - "\n", - "As shown, each of the circuits has only one $X$ rotation gate with a random angle. The circuit is repeated five times with different random rotations. Note that the algorithm script does not specify the backend Amazon Braket device ARN explicitly. Instead, it is provided through environment variables such as `os.environ[\"AMZN_BRAKET_DEVICE_ARN\"]` that are passed to the algorithm script when creating the hybrid job. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "#### This block is a copy of the algorithm script.\n", - "\n", - "```python\n", - "\n", - "import os\n", - "import numpy as np\n", - "\n", - "from braket.aws import AwsDevice\n", - "from braket.circuits import Circuit\n", - "from braket.jobs import save_job_result\n", - "from braket.tracking import Tracker\n", - "\n", - "t = Tracker().start()\n", - "\n", - "print(\"Test hybrid job started!\")\n", - "\n", - "# Use the device declared in the creation script\n", - "device = AwsDevice(os.environ[\"AMZN_BRAKET_DEVICE_ARN\"])\n", - "\n", - "counts_list = []\n", - "angle_list = []\n", - "for _ in range(5):\n", - " angle = np.pi * np.random.randn()\n", - " random_circuit = Circuit().rx(0, angle)\n", - "\n", - " task = device.run(random_circuit, shots=100)\n", - " counts = task.result().measurement_counts\n", - "\n", - " angle_list.append(angle)\n", - " counts_list.append(counts)\n", - " print(counts)\n", - "\n", - "# Save the variables of interest so that we can access later\n", - "save_job_result({\"counts\": counts_list, \"angle\": angle_list, \"estimated cost\": t.qpu_tasks_cost() + t.simulator_tasks_cost()})\n", - "\n", - "print(\"Test hybrid job completed!\")\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating your first hybrid job\n", - "\n", - "Once the script is finalized, you can create a Braket Hybrid Job with `AwsQuantumJob`. When the hybrid job is created, Amazon Braket starts the hybrid job instance (based on EC2) and spins up a Docker container to run your algorithm script. Other configurations can be specified via keyword arguments. See the [developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/what-is-braket.html) and other example notebooks to learn more about how to customize your jobs\n", - "\n", - "This example uses the following inputs for `AwsQuantumJob`:\n", - "- device: The ARN of the Braket simulator or QPU to use in the hybrid job. It will be passed as an environment variable to the algorithm script. \n", - "- source_module: The path to a file or a Python module that contains your algorithm script. It will be uploaded to the container for running the Braket Hybrid Job.\n", - "- wait_until_complete (optional): If True, the function call will wait until the Braket Hybrid Job is completed and will additionally print logs to the local console. Otherwise, it will run asynchronously. The default is False." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from braket.aws import AwsDevice, AwsQuantumJob\n", - "from braket.devices import Devices" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initializing Braket Job: arn:aws:braket:::job/\n", - "...............................................\n", - "\u001b[34m2021-11-10 20:55:24,467 sagemaker-training-toolkit INFO Invoking user script\u001b[0m\n", - "\u001b[34mTraining Env:\u001b[0m\n", - "\u001b[34m{\n", - " \"additional_framework_parameters\": {},\n", - " \"channel_input_dirs\": {},\n", - " \"current_host\": \"algo-1\",\n", - " \"framework_module\": null,\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"hyperparameters\": {},\n", - " \"input_config_dir\": \"/opt/ml/input/config\",\n", - " \"input_data_config\": {},\n", - " \"input_dir\": \"/opt/ml/input\",\n", - " \"is_master\": true,\n", - " \"job_name\": \"BraketJob--\",\n", - " \"log_level\": 20,\n", - " \"master_hostname\": \"algo-1\",\n", - " \"model_dir\": \"/opt/ml/model\",\n", - " \"module_dir\": \"/opt/ml/code\",\n", - " \"module_name\": \"braket_container\",\n", - " \"network_interface_name\": \"eth0\",\n", - " \"num_cpus\": 2,\n", - " \"num_gpus\": 0,\n", - " \"output_data_dir\": \"/opt/ml/output/data\",\n", - " \"output_dir\": \"/opt/ml/output\",\n", - " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", - " \"resource_config\": {\n", - " \"current_host\": \"algo-1\",\n", - " \"hosts\": [\n", - " \"algo-1\"\n", - " ],\n", - " \"network_interface_name\": \"eth0\"\n", - " },\n", - " \"user_entry_point\": \"braket_container.py\"\u001b[0m\n", - "...............................................\n", - "...............................................\n", - "\u001b[34mRunning Code As Subprocess\u001b[0m\n", - "\u001b[34mTest job started!!!!!\u001b[0m\n", - "\u001b[34mCounter({'0': 88, '1': 12})\u001b[0m\n", - "\u001b[34mCounter({'1': 58, '0': 42})\u001b[0m\n", - "\u001b[34mCounter({'1': 54, '0': 46})\u001b[0m\n", - "\u001b[34mCounter({'0': 100})\u001b[0m\n", - "\u001b[34mCounter({'0': 100})\u001b[0m\n", - "\u001b[34mTest job completed!!!!!\u001b[0m\n", - "\u001b[34mCode Run Finished\u001b[0m\n", - "\u001b[34m2021-11-10 20:55:58,953 sagemaker-training-toolkit INFO Reporting training SUCCESS\u001b[0m\n" - ] - } - ], - "source": [ - "# This cell should take about 5 mins\n", - "job = AwsQuantumJob.create(\n", - " device=Devices.Amazon.SV1,\n", - " source_module=\"algorithm_script.py\",\n", - " wait_until_complete=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, the algorithm is defined by a single file, so the `source_module` is `algorithm_script.py`. Depending on your application, there are other options for setting the source module. For example, if you wish to only execute a part of `algorithm_script.py` at the start of a Braket Hybrid Job, you can package that part to be a `starting_function()`. Then assign the function as the entry point by adding the `entry_point` input argument." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "source_module = \"algorithm_script.py\"\n", - "entry_point = \"algorithm_script:starting_function\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If your algorithm script requires other dependencies, you can put them all in one folder, say the `algorithm_folder`. The input arguments would then be" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "source_module = \"algorithm_folder\"\n", - "entry_point = \"algorithm_folder.algorithm_script:starting_function\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Checking hybrid job state and loading results\n", - "\n", - "The status of a Braket Job can be checked by calling `job.state()`. The state will be one of \"QUEUED\", \"RUNNING\", \"FAILED\", \"COMPLETED\", \"CANCELLING\", or \"CANCELLED\". " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'COMPLETED'" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job.state()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once completed, the result can be retrieved using `job.result()`. Logs and metadata are also accessible via `job.logs()` and `job.metadata()`. If you lose the reference to the hybrid job object, you can always reinstantiate it using your hybrid job ARN as `job=AwsQuantumJob(\"your-job-arn\")`. The ARN of a hybrid job can be found in the Amazon Braket Console. By default the ARN of a hybrid job will be \"`arn:aws:braket:::job/`\". " - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "counts: [{'1': 12, '0': 88}, {'0': 42, '1': 58}, {'0': 46, '1': 54}, {'0': 100}, {'0': 100}]\n", - "angles: [-0.6634809825751307, 1.8729107298836103, -1.8816578492668359, -0.04308463076559567, 0.03224990551866221]\n" - ] - } - ], - "source": [ - "results = job.result() # will return once job.state() = \"COMPLETED\", should be 6 minutes\n", - "print(\"counts: \", results[\"counts\"])\n", - "print(\"angles: \", results[\"angles\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# print(job.logs()) # uncomment to print logs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can also download the result to a local directory." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "job.download_result() # download hybrid job result to local directory" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Task Summary\n", - "{'arn:aws:braket:::device/quantum-simulator/amazon/sv1': {'shots': 500, 'tasks': {'COMPLETED': 5}, 'execution_duration': 0.081, 'billed_execution_duration': 15.0}}\n", - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run tasks in this job: 0.01875 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(job.result()['task summary'])\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run quantum tasks in this hybrid job: {job.result()['estimated cost']} USD\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Increase performance by running hybrid jobs on QPUs\n", - "\n", - "With Braket Hybrid Jobs, you can run hybrid algorithms on all QPUs available through Amazon Braket. When you select a QPU as your device, your hybrid job will have priority access for the duration of your hybrid job. Quantum tasks created as part of your hybrid job will be executed ahead of other tasks in the device queue. This reduces the risk of certain tasks being delayed or drifting calibrations on the device. To secure priority on a device your job needs to wait for the device to complete running or already queued jobs. Before submitting the job on a device, you can check the queue depth for the hybrid jobs. To check the number of hybrid jobs queued on the device call `device.queue_depth().jobs`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'2'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Select the device on which you will be submitting your hybrid job.\n", - "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "device.queue_depth().jobs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can seamlessly swap the SV1 simulator for a QPU by changing the device argument in `AwsQuantumJob.create()`. For instance, the code below will create a hybrid job with priority access on the Rigetti Ankaa-2 device:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# qpu_job = AwsQuantumJob.create(\n", - "# device=Devices.Rigetti.Ankaa2,\n", - "# source_module=\"algorithm_script.py\",\n", - "# wait_until_complete=False,\n", - "# )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can check the position of your hybrid job in the queue by calling job.queue_position().queue_position. The queue position is only returned when the job is in \"QUEUED\" state, else None is returned. You can also check why the queue position value is not returned by calling calling `job.queue_position().message`. Here, `job` is the variable to which you assign your job creation. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'3'" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# qpu_job.queue_position().queue_position" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you create the hybrid job, Amazon Braket will wait for the QPU to become available before initializing the hybrid job. Note that the Braket Hybrid Job will automatically select the AWS region where the device is available. As mentioned earlier, the specified device is provided to the hybrid job in the environment variable `AMZN_BRAKET_DEVICE_ARN`; the script `algorithm_script.py` uses this variable to choose the Braket device to use.\n", - "\n", - "In variational algorithms, there are usually optimization processes that update parameters of a fixed parametrized circuit. When executing such algorithms on a supported QPU with Hybrid Jobs, parametric compilation can improve the performance of the hybrid jobs. All you need to do is to submit the parametrized circuit using free parameters in the algorithm script. Braket will compile the circuit once and manage the compiled circuit of the Hybrid Job. There is no recompilation for subsequent parameter updates to the same circuit, resulting in faster runtimes. An example of algorithm script that uses a parametrized circuit is in `algorithm_script_parametrized_circuit.py`. Use this algorithm script in the place of `algorithm_script.py` and submit a hybrid job to a supported Braket QPU to use parametric compilation. See the Amazon Braket developer guide to learn more about [the usage of free parameters](https://docs.aws.amazon.com/braket/latest/developerguide/braket-constructing-circuit.html#braket-gates) and [parametric compilation with Hybrid Jobs](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## AWS Sessions\n", - "\n", - "You can customize the default location where Braket Hybrid Jobs saves and loads results in Amazon S3 by providing the AWS session information. The name of the S3 bucket needs to start with \"amazon-braket-\", and it must be in the same region as the hybrid job being created." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "from braket.aws import AwsSession\n", - "\n", - "# Set Amazon S3 bucket\n", - "aws_session = AwsSession(default_bucket=\"amazon-braket-bucket-name\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To create a Braket Hybrid Job with this S3 bucket, pass `aws_session` as an argument to ` AwsQuantumJob.create()`:\n", - "\n", - "```python\n", - "job = AwsQuantumJob.create(\n", - " device=Devices.Amazon.SV1,\n", - " source_module=\"algorithm_script.py\",\n", - " aws_session=aws_session # using specific S3 bucket\n", - ")\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Debugging with local Braket Hybrid Jobs\n", - "\n", - "For faster testing and debugging of your code, you can run a hybrid job locally in your own environment. This feature requires Docker to be installed in your local environment. Amazon Braket notebooks have Docker pre-installed, so you can test local hybrid jobs in hosted notebooks instantly. To install Docker in your local environment, follow these [instructions](https://docs.docker.com/get-docker/). When a local hybrid job is created for the first time, it will take longer because it needs to build the container. The subsequent runs will be faster. Note that local hybrid jobs will not be visible in the Amazon Braket Console.\n", - "\n", - "To run a hybrid job in local mode, make sure the Docker daemon is running, and then simply create a `LocalQuantumJob` instead of an `AwsQuantumJob`. Local hybrid jobs always run synchronously and display the logs." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Using the short-lived AWS credentials found in session. They might expire while running.\n", - "Boto3 Version: 1.18.33\n", - "Beginning Setup\n", - "Completed 50.5 KiB/50.5 KiB (72.5 KiB/s) with 1 file(s) remaining\n", - "...............................................\n", - "...............................................\n", - "Running Code As Subprocess\n", - "Test job started!!!!!\n", - "Counter({'0': 79, '1': 21})\n", - "Counter({'0': 84, '1': 16})\n", - "Counter({'0': 91, '1': 9})\n", - "Counter({'0': 85, '1': 15})\n", - "Counter({'1': 94, '0': 6})\n", - "Test job completed!!!!!\n", - "Code Run Finished\n" - ] - } - ], - "source": [ - "from braket.jobs.local.local_job import LocalQuantumJob\n", - "\n", - "# This cell should take about 2 min\n", - "job = LocalQuantumJob.create(\n", - " device=Devices.Amazon.SV1,\n", - " source_module=\"algorithm_script.py\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Task Summary\n", - "{'arn:aws:braket:::device/quantum-simulator/amazon/sv1': {'shots': 500, 'tasks': {'COMPLETED': 5}, 'execution_duration': 0.046, 'billed_execution_duration': 15.0}}\n", - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run tasks in this job: 0.01875 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(job.result()['task summary'])\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run quantum tasks in this hybrid job: {job.result()['estimated cost']} USD\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Creating a Braket Hybrid Job from the Braket console\n", - "\n", - "Besides creating a Braket Hybrid Job programmatically using `AwsQuantumJob.create`, there is also an option to create a hybrid job in the Braket console. Follow [this link](https://us-west-2.console.aws.amazon.com/braket/home#/job/create) to the \\\"Create hybrid job\\\" page. First, we need to give our new hybrid job the algorithm script. The script can be uploaded directly from your computer in the console or selected from files that are uploaded to S3. Here you also have the option to provide input data and parameters to your algorithm. After the algorithm is specified, you have the option to skip directly to the review and create page.\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, you can choose a name for your hybrid job or use the default name. You also have the option to change the default execution role and the default S3 location for uploads.\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Third, select a container environment for your job. The default \"PennyLane\" container is enough for the example in this notebook. For information about using other pre-built or custom containers, see the [Pennylane](../2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb) and the [BYOC](../3_Bring_your_own_container/bring_your_own_container.ipynb) example notebooks. \n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You may also select a Braket on-demand simulator or QPU for your job and configure the execution settings. You also have the option to customize the default locations for checkpoints and output data. We dive deeper into these advanced use cases in other [example notebooks](../2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb).\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After finishing all the settings, you can review your selections before submitting your hybrid job. You can now create the hybrid job by clicking the \\\"Create hybrid job\\\" button or return to any earlier step to make edits. We can now view the progress in the Braket console.\n", - "\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this tutorial, we have created our first Braket Job with a simple batch of five circuits using the Amazon Braket SDK and, as an alternative, from the Braket console. We learned how to change the Amazon S3 folder and the AWS region for a job, and how to save results, and how to retrieve queue depth for a device, and queue position for the hybrid job. We learned how to seamlessly change the device to run on simulators or QPUs. We used local mode to quickly test code. Finally, we created the same job using the Braket console." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "conda_braket", - "language": "python", - "name": "conda_braket" - }, - "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.9" - }, - "vscode": { - "interpreter": { - "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting started with Amazon Braket Hybrid Jobs\n", + "\n", + "This tutorial shows how to run your first Amazon Braket Hybrid Job. To get started, we consider small circuits with only one qubit and one gate.\n", + "\n", + "\n", + "## Learning outcomes\n", + "* Get setup to run your first hybrid job\n", + "* Write an algorithm script to run on Braket Hybrid Jobs\n", + "* Understand how to run scripts or functions\n", + "* Create a hybrid job on Braket simulators or QPUs\n", + "* Monitoring the hybrid job state\n", + "* Save results from a hybrid job\n", + "* Using a specific AWS session\n", + "* Running hybrid jobs with priority on QPUs\n", + "* Use local hybrid jobs to quickly test and debug scripts\n", + "* Create a Braket Hybrid Job using the Braket console" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Getting setup to run Braket Hybrid Jobs\n", + "\n", + "When you use Amazon Braket Hybrid Jobs for the first time, you need to create an IAM role with the right [permissions](https://docs.aws.amazon.com/braket/latest/developerguide/braket-manage-access.html#about-amazonbraketjobsexecution). This role allows your hybrid job to perform actions on your behalf while it is executing your algorithm, for instance, access S3 to return the results of your hybrid job. To create the role or check if you already have one please visit the Permissions tab from the left menu of the Braket Console.\n", + "\n", + "## Writing an algorithm script\n", + "\n", + "To create a Braket Hybrid Job, you first need a Python script to run. In this example, it's contained in `algorithm_script.py`. The script is printed in the code cell below for convenience. \n", + "\n", + "As shown, each of the circuits has only one $X$ rotation gate with a random angle. The circuit is repeated five times with different random rotations. Note that the algorithm script does not specify the backend Amazon Braket device ARN explicitly. Instead, it is provided through environment variables such as `os.environ[\"AMZN_BRAKET_DEVICE_ARN\"]` that are passed to the algorithm script when creating the hybrid job. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "#### This block is a copy of the algorithm script.\n", + "\n", + "```python\n", + "\n", + "import os\n", + "import numpy as np\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit\n", + "from braket.jobs import save_job_result\n", + "from braket.tracking import Tracker\n", + "\n", + "t = Tracker().start()\n", + "\n", + "print(\"Test hybrid job started!\")\n", + "\n", + "# Use the device declared in the creation script\n", + "device = AwsDevice(os.environ[\"AMZN_BRAKET_DEVICE_ARN\"])\n", + "\n", + "counts_list = []\n", + "angle_list = []\n", + "for _ in range(5):\n", + " angle = np.pi * np.random.randn()\n", + " random_circuit = Circuit().rx(0, angle)\n", + "\n", + " task = device.run(random_circuit, shots=100)\n", + " counts = task.result().measurement_counts\n", + "\n", + " angle_list.append(angle)\n", + " counts_list.append(counts)\n", + " print(counts)\n", + "\n", + "# Save the variables of interest so that we can access later\n", + "save_job_result({\"counts\": counts_list, \"angle\": angle_list, \"estimated cost\": t.qpu_tasks_cost() + t.simulator_tasks_cost()})\n", + "\n", + "print(\"Test hybrid job completed!\")\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating your first hybrid job\n", + "\n", + "Once the script is finalized, you can create a Braket Hybrid Job with `AwsQuantumJob`. When the hybrid job is created, Amazon Braket starts the hybrid job instance (based on EC2) and spins up a Docker container to run your algorithm script. Other configurations can be specified via keyword arguments. See the [developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/what-is-braket.html) and other example notebooks to learn more about how to customize your jobs\n", + "\n", + "This example uses the following inputs for `AwsQuantumJob`:\n", + "- device: The ARN of the Braket simulator or QPU to use in the hybrid job. It will be passed as an environment variable to the algorithm script. \n", + "- source_module: The path to a file or a Python module that contains your algorithm script. It will be uploaded to the container for running the Braket Hybrid Job.\n", + "- wait_until_complete (optional): If True, the function call will wait until the Braket Hybrid Job is completed and will additionally print logs to the local console. Otherwise, it will run asynchronously. The default is False." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from braket.aws import AwsDevice, AwsQuantumJob\n", + "from braket.devices import Devices" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initializing Braket Job: arn:aws:braket:::job/\n", + "...............................................\n", + "\u001b[34m2021-11-10 20:55:24,467 sagemaker-training-toolkit INFO Invoking user script\u001b[0m\n", + "\u001b[34mTraining Env:\u001b[0m\n", + "\u001b[34m{\n", + " \"additional_framework_parameters\": {},\n", + " \"channel_input_dirs\": {},\n", + " \"current_host\": \"algo-1\",\n", + " \"framework_module\": null,\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"hyperparameters\": {},\n", + " \"input_config_dir\": \"/opt/ml/input/config\",\n", + " \"input_data_config\": {},\n", + " \"input_dir\": \"/opt/ml/input\",\n", + " \"is_master\": true,\n", + " \"job_name\": \"BraketJob--\",\n", + " \"log_level\": 20,\n", + " \"master_hostname\": \"algo-1\",\n", + " \"model_dir\": \"/opt/ml/model\",\n", + " \"module_dir\": \"/opt/ml/code\",\n", + " \"module_name\": \"braket_container\",\n", + " \"network_interface_name\": \"eth0\",\n", + " \"num_cpus\": 2,\n", + " \"num_gpus\": 0,\n", + " \"output_data_dir\": \"/opt/ml/output/data\",\n", + " \"output_dir\": \"/opt/ml/output\",\n", + " \"output_intermediate_dir\": \"/opt/ml/output/intermediate\",\n", + " \"resource_config\": {\n", + " \"current_host\": \"algo-1\",\n", + " \"hosts\": [\n", + " \"algo-1\"\n", + " ],\n", + " \"network_interface_name\": \"eth0\"\n", + " },\n", + " \"user_entry_point\": \"braket_container.py\"\u001b[0m\n", + "...............................................\n", + "...............................................\n", + "\u001b[34mRunning Code As Subprocess\u001b[0m\n", + "\u001b[34mTest job started!!!!!\u001b[0m\n", + "\u001b[34mCounter({'0': 88, '1': 12})\u001b[0m\n", + "\u001b[34mCounter({'1': 58, '0': 42})\u001b[0m\n", + "\u001b[34mCounter({'1': 54, '0': 46})\u001b[0m\n", + "\u001b[34mCounter({'0': 100})\u001b[0m\n", + "\u001b[34mCounter({'0': 100})\u001b[0m\n", + "\u001b[34mTest job completed!!!!!\u001b[0m\n", + "\u001b[34mCode Run Finished\u001b[0m\n", + "\u001b[34m2021-11-10 20:55:58,953 sagemaker-training-toolkit INFO Reporting training SUCCESS\u001b[0m\n" + ] + } + ], + "source": [ + "# This cell should take about 5 mins\n", + "job = AwsQuantumJob.create(\n", + " device=Devices.Amazon.SV1,\n", + " source_module=\"algorithm_script.py\",\n", + " wait_until_complete=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this example, the algorithm is defined by a single file, so the `source_module` is `algorithm_script.py`. Depending on your application, there are other options for setting the source module. For example, if you wish to only execute a part of `algorithm_script.py` at the start of a Braket Hybrid Job, you can package that part to be a `starting_function()`. Then assign the function as the entry point by adding the `entry_point` input argument." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "source_module = \"algorithm_script.py\"\n", + "entry_point = \"algorithm_script:starting_function\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If your algorithm script requires other dependencies, you can put them all in one folder, say the `algorithm_folder`. The input arguments would then be" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "source_module = \"algorithm_folder\"\n", + "entry_point = \"algorithm_folder.algorithm_script:starting_function\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Checking hybrid job state and loading results\n", + "\n", + "The status of a Braket Job can be checked by calling `job.state()`. The state will be one of \"QUEUED\", \"RUNNING\", \"FAILED\", \"COMPLETED\", \"CANCELLING\", or \"CANCELLED\". " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'COMPLETED'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.state()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once completed, the result can be retrieved using `job.result()`. Logs and metadata are also accessible via `job.logs()` and `job.metadata()`. If you lose the reference to the hybrid job object, you can always reinstantiate it using your hybrid job ARN as `job=AwsQuantumJob(\"your-job-arn\")`. The ARN of a hybrid job can be found in the Amazon Braket Console. By default the ARN of a hybrid job will be \"`arn:aws:braket:::job/`\". " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "counts: [{'1': 12, '0': 88}, {'0': 42, '1': 58}, {'0': 46, '1': 54}, {'0': 100}, {'0': 100}]\n", + "angles: [-0.6634809825751307, 1.8729107298836103, -1.8816578492668359, -0.04308463076559567, 0.03224990551866221]\n" + ] + } + ], + "source": [ + "results = job.result() # will return once job.state() = \"COMPLETED\", should be 6 minutes\n", + "print(\"counts: \", results[\"counts\"])\n", + "print(\"angles: \", results[\"angles\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# print(job.logs()) # uncomment to print logs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also download the result to a local directory." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "job.download_result() # download hybrid job result to local directory" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Task Summary\n", + "{'arn:aws:braket:::device/quantum-simulator/amazon/sv1': {'shots': 500, 'tasks': {'COMPLETED': 5}, 'execution_duration': 0.081, 'billed_execution_duration': 15.0}}\n", + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run tasks in this job: 0.01875 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(job.result()[\"task summary\"])\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run quantum tasks in this hybrid job: {job.result()['estimated cost']} USD\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Increase performance by running hybrid jobs on QPUs\n", + "\n", + "With Braket Hybrid Jobs, you can run hybrid algorithms on all QPUs available through Amazon Braket. When you select a QPU as your device, your hybrid job will have priority access for the duration of your hybrid job. Quantum tasks created as part of your hybrid job will be executed ahead of other tasks in the device queue. This reduces the risk of certain tasks being delayed or drifting calibrations on the device. To secure priority on a device your job needs to wait for the device to complete running or already queued jobs. Before submitting the job on a device, you can check the queue depth for the hybrid jobs. To check the number of hybrid jobs queued on the device call `device.queue_depth().jobs`." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Select the device on which you will be submitting your hybrid job.\n", + "device = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "device.queue_depth().jobs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can seamlessly swap the SV1 simulator for a QPU by changing the device argument in `AwsQuantumJob.create()`. For instance, the code below will create a hybrid job with priority access on the Rigetti Ankaa-2 device:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# qpu_job = AwsQuantumJob.create(\n", + "# device=Devices.Rigetti.Ankaa2,\n", + "# source_module=\"algorithm_script.py\",\n", + "# wait_until_complete=False,\n", + "# )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can check the position of your hybrid job in the queue by calling job.queue_position().queue_position. The queue position is only returned when the job is in \"QUEUED\" state, else None is returned. You can also check why the queue position value is not returned by calling calling `job.queue_position().message`. Here, `job` is the variable to which you assign your job creation. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'3'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# qpu_job.queue_position().queue_position" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When you create the hybrid job, Amazon Braket will wait for the QPU to become available before initializing the hybrid job. Note that the Braket Hybrid Job will automatically select the AWS region where the device is available. As mentioned earlier, the specified device is provided to the hybrid job in the environment variable `AMZN_BRAKET_DEVICE_ARN`; the script `algorithm_script.py` uses this variable to choose the Braket device to use.\n", + "\n", + "In variational algorithms, there are usually optimization processes that update parameters of a fixed parametrized circuit. When executing such algorithms on a supported QPU with Hybrid Jobs, parametric compilation can improve the performance of the hybrid jobs. All you need to do is to submit the parametrized circuit using free parameters in the algorithm script. Braket will compile the circuit once and manage the compiled circuit of the Hybrid Job. There is no recompilation for subsequent parameter updates to the same circuit, resulting in faster runtimes. An example of algorithm script that uses a parametrized circuit is in `algorithm_script_parametrized_circuit.py`. Use this algorithm script in the place of `algorithm_script.py` and submit a hybrid job to a supported Braket QPU to use parametric compilation. See the Amazon Braket developer guide to learn more about [the usage of free parameters](https://docs.aws.amazon.com/braket/latest/developerguide/braket-constructing-circuit.html#braket-gates) and [parametric compilation with Hybrid Jobs](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## AWS Sessions\n", + "\n", + "You can customize the default location where Braket Hybrid Jobs saves and loads results in Amazon S3 by providing the AWS session information. The name of the S3 bucket needs to start with \"amazon-braket-\", and it must be in the same region as the hybrid job being created." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "from braket.aws import AwsSession\n", + "\n", + "# Set Amazon S3 bucket\n", + "aws_session = AwsSession(default_bucket=\"amazon-braket-bucket-name\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To create a Braket Hybrid Job with this S3 bucket, pass `aws_session` as an argument to ` AwsQuantumJob.create()`:\n", + "\n", + "```python\n", + "job = AwsQuantumJob.create(\n", + " device=Devices.Amazon.SV1,\n", + " source_module=\"algorithm_script.py\",\n", + " aws_session=aws_session # using specific S3 bucket\n", + ")\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Debugging with local Braket Hybrid Jobs\n", + "\n", + "For faster testing and debugging of your code, you can run a hybrid job locally in your own environment. This feature requires Docker to be installed in your local environment. Amazon Braket notebooks have Docker pre-installed, so you can test local hybrid jobs in hosted notebooks instantly. To install Docker in your local environment, follow these [instructions](https://docs.docker.com/get-docker/). When a local hybrid job is created for the first time, it will take longer because it needs to build the container. The subsequent runs will be faster. Note that local hybrid jobs will not be visible in the Amazon Braket Console.\n", + "\n", + "To run a hybrid job in local mode, make sure the Docker daemon is running, and then simply create a `LocalQuantumJob` instead of an `AwsQuantumJob`. Local hybrid jobs always run synchronously and display the logs." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using the short-lived AWS credentials found in session. They might expire while running.\n", + "Boto3 Version: 1.18.33\n", + "Beginning Setup\n", + "Completed 50.5 KiB/50.5 KiB (72.5 KiB/s) with 1 file(s) remaining\n", + "...............................................\n", + "...............................................\n", + "Running Code As Subprocess\n", + "Test job started!!!!!\n", + "Counter({'0': 79, '1': 21})\n", + "Counter({'0': 84, '1': 16})\n", + "Counter({'0': 91, '1': 9})\n", + "Counter({'0': 85, '1': 15})\n", + "Counter({'1': 94, '0': 6})\n", + "Test job completed!!!!!\n", + "Code Run Finished\n" + ] + } + ], + "source": [ + "from braket.jobs.local.local_job import LocalQuantumJob\n", + "\n", + "# This cell should take about 2 min\n", + "job = LocalQuantumJob.create(\n", + " device=Devices.Amazon.SV1,\n", + " source_module=\"algorithm_script.py\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Task Summary\n", + "{'arn:aws:braket:::device/quantum-simulator/amazon/sv1': {'shots': 500, 'tasks': {'COMPLETED': 5}, 'execution_duration': 0.046, 'billed_execution_duration': 15.0}}\n", + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run tasks in this job: 0.01875 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(job.result()[\"task summary\"])\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run quantum tasks in this hybrid job: {job.result()['estimated cost']} USD\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating a Braket Hybrid Job from the Braket console\n", + "\n", + "Besides creating a Braket Hybrid Job programmatically using `AwsQuantumJob.create`, there is also an option to create a hybrid job in the Braket console. Follow [this link](https://us-west-2.console.aws.amazon.com/braket/home#/job/create) to the \\\"Create hybrid job\\\" page. First, we need to give our new hybrid job the algorithm script. The script can be uploaded directly from your computer in the console or selected from files that are uploaded to S3. Here you also have the option to provide input data and parameters to your algorithm. After the algorithm is specified, you have the option to skip directly to the review and create page.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, you can choose a name for your hybrid job or use the default name. You also have the option to change the default execution role and the default S3 location for uploads.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Third, select a container environment for your job. The default \"PennyLane\" container is enough for the example in this notebook. For information about using other pre-built or custom containers, see the [Pennylane](../2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb) and the [BYOC](../3_Bring_your_own_container/bring_your_own_container.ipynb) example notebooks. \n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You may also select a Braket on-demand simulator or QPU for your job and configure the execution settings. You also have the option to customize the default locations for checkpoints and output data. We dive deeper into these advanced use cases in other [example notebooks](../2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb).\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After finishing all the settings, you can review your selections before submitting your hybrid job. You can now create the hybrid job by clicking the \\\"Create hybrid job\\\" button or return to any earlier step to make edits. We can now view the progress in the Braket console.\n", + "\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In this tutorial, we have created our first Braket Job with a simple batch of five circuits using the Amazon Braket SDK and, as an alternative, from the Braket console. We learned how to change the Amazon S3 folder and the AWS region for a job, and how to save results, and how to retrieve queue depth for a device, and queue position for the hybrid job. We learned how to seamlessly change the device to run on simulators or QPUs. We used local mode to quickly test code. Finally, we created the same job using the Braket console." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "conda_braket", + "language": "python", + "name": "conda_braket" + }, + "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.9" + }, + "vscode": { + "interpreter": { + "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script.py b/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script.py index 979393560..e39609572 100644 --- a/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script.py +++ b/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script.py @@ -14,6 +14,7 @@ import os import numpy as np + from braket.aws import AwsDevice from braket.circuits import Circuit from braket.jobs import save_job_result diff --git a/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script_parametrized_circuit.py b/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script_parametrized_circuit.py index 9f99ae9b2..7efbc231e 100644 --- a/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script_parametrized_circuit.py +++ b/examples/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/algorithm_script_parametrized_circuit.py @@ -14,6 +14,7 @@ import os import numpy as np + from braket.aws import AwsDevice from braket.circuits import Circuit from braket.jobs import save_job_result @@ -35,7 +36,7 @@ theta_list = [] for i in range(5): theta_value = np.pi * np.random.rand() - + task = device.run(parametrized_circuit, shots=100, inputs={"theta": theta_value}) counts = task.result().measurement_counts diff --git a/examples/hybrid_quantum_algorithms/QAOA/QAOA_braket.ipynb b/examples/hybrid_quantum_algorithms/QAOA/QAOA_braket.ipynb index d220741ed..b50000ba8 100644 --- a/examples/hybrid_quantum_algorithms/QAOA/QAOA_braket.ipynb +++ b/examples/hybrid_quantum_algorithms/QAOA/QAOA_braket.ipynb @@ -1,1121 +1,1139 @@ { - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", - "from braket.tracking import Tracker\n", - "t = Tracker().start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# QUANTUM APPROXIMATE OPTIMIZATION ALGORITHM (QAOA)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this tutorial we show how to (approximately) solve binary combinatorial optimization problems, using the __Quantum Approximate Optimization Algorithm (QAOA)__, as introduced in Ref.[1]. \n", - "The QAOA algorithm belongs to the class of __hybrid quantum algorithms__ (leveraging both classical as well as quantum compute), that are widely believed to be the working horse for the current __NISQ (noisy intermediate-scale quantum) era__.\n", - "In this NISQ era QAOA is also an emerging approach for benchmarking quantum devices and is a prime candidate for demonstrating a practical quantum speed-up on near-term NISQ device [1,4]. \n", - "To validate our approach we benchmark our results with exact results as obtained from classical QUBO solvers. \n", - "\n", - "We provide a step-by-step walkthrough explaining the QAOA quantum algorithm and show how to build the corresponding parametrized quantum circuit ansatz using the ```Braket``` SDK, with simple modular building blocks (that can be re-used for other purposes). \n", - "We use open-source off-the-shelf ```scipy``` optimizers for classical numerical optimization. \n", - "While we demonstrate our proof-of-concept approach using classical simulators for circuit execution, our code could in principle be run on actual quantum hardware by simply changing the definition of the ```device``` object (provided that the gate set used in the ansatz is supported by the device, as is the case here for IonQ; for Rigetti we need to apply one more extra trick as shown below). " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BACKGROUND: HYBRID QUANTUM ALGORITHMS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Quantum computers hold the promise to outperform even the most-powerful classical computers on a range of computational problems in (for example) optimization, chemistry, material science and cryptography.\n", - "The canonical set of quantum algorithms (such as Shor's or Grover's quantum algorithms), however, comes with hardware requirements (such as a large number of quantum gates) that are currently not available with state-of-the-art technology. \n", - "Specifically, these algorithms are typically believed to be feasible only with fault-tolerance as provided by quantum error correction. \n", - "In the current __noisy intermediate-scale (NISQ) era__, near-term quantum computers do not have a large enough number of physical qubits for the implementation of error correction protocols, making this canonical set of quantum algorithms unsuitable for near-term devices. Against this background, the near-term focus has widely shifted to the class of __hybrid quantum algorithms__ that do not require quantum error correction. \n", - "In these hybrid quantum algorithms, the noisy __near-term quantum computers are used as co-processors__ only, within a larger classical optimization loop, as sketched in the schematic figure below. \n", - "Here, the undesired effects of noise are suppressed by deliberately limiting the quantum circuits on the quantum processing unit (QPU) to short bursts of the calculation, and the need for long coherence times (as required for the standard set of quantum algorithms) is traded for a classical overhead due to (possibly many) measurement repetitions and (essentially error-free) classical processing. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "__Variational Quantum Algorithms__: Specifically, variational quantum algorithms such as the Quantum Approximate Optimization Algorithm (QAOA) [1] belong to this emerging class of hybrid quantum algorithms. \n", - "These are widely believed to be promising candidates for the demonstration of a __quantum advantage__, already with near-term (NISQ) devices in areas such as quantum chemistry [2], condensed matter simulations [3], and discrete optimization tasks [4].\n", - "\n", - "__Variational Quantum Computing vs. Deep Learning__: The working principle of variational quantum computing is very much reminiscent of training deep neural networks: \n", - "when you train a neural network, you have an objective function that you want to minimize, typically characterized by the error on your training set. \n", - "To minimize that error, typically you start out with an initial guess for the weights in your network. \n", - "The coprocessor, in that case a GPU, takes these weights which define the exact operation to execute and the output of the neural network is computed. \n", - "This output is then used to calculate the value of your objective function, which in turn is used by the CPU to make an educated guess to update the weights and the cycle continues. \n", - "Variational quantum algorithms, a specific form of hybrid algorithms, work in the very same way, using parametrized quantum circuits rather than parametrized neural networks and replacing the GPU with a QPU. \n", - "Here, you start with an initial guess for the parameters that define your circuit, have the QPU execute that circuit, perform measurements to calculate an objective function, pass this value (together with the current values of the parameters) back to the CPU and have this *classical* CPU update the parameters based on that information. \n", - "\n", - "Of course, coordinating that workflow for quantum computers is much more challenging than in the previous case. Quantum computers are located in specialized laboratory facilities, are typically single threaded, and have special latency requirements. \n", - "This is exactly the undifferentiated heavy-lifting that Amazon Braket handles for us, such that we can focus on our scientific problem. \n", - "For the sake of this introductory tutorial, we simply use a classical circuit simulator (that mimic the behavior of a quantum machine) as the device to execute our quantum circuits.\n", - "Within Amazon Braket, the workflow, however, is exactly the same. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BACKGROUND: QUADRATIC BINARY OPTIMIZATION PROBLEMS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "__Combinatorial optimization__: \n", - "Combinatorial optimization problems are ubiquitous across many areas of science and application areas. \n", - "Applications can be found (for example) in logistics, scheduling, planning, and portfolio optimization.\n", - "In a nutshell combinatorial optimization problems are problems involving a large number of yes/no decisions with each set of decisions yielding a corresponding objective function value, like a cost or profit value. \n", - "Because of the combinatorial explosion of the solution space with the number of variables, finding good solutions is a daunting task and extremely difficult. \n", - "\n", - "__QUBO problems__: The QUBO ([Quadratic Unconstrained Binary Optimization](https://en.wikipedia.org/wiki/Quadratic_unconstrained_binary_optimization)) model unifies a rich variety of NP-hard combinatorial optimization problems: \n", - "Famous examples include Quadratic Assignment Problems, Capital Budgeting Problems, Task Allocation Problems and Maximum-Cut Problems. \n", - "For more details we refer to the excellent review and tutorial on QUBO problems presented in Ref.[5].\n", - "\n", - "__Maximum Cut__: Among the class of QUBO problems, Maximum Cut (MaxCut) is paradigm combinatorial optimization problem. \n", - "Given a graph $G=(V,E)$ with vertex set $V$ and edge set $E$, we seek partition of $V$ into two subsets with maximum cut. \n", - "In short, we have to color every node either blue or red and we score a point whenever an edge connects two nodes with different colors. \n", - "We then would like to find the solution with the highest score. \n", - "Applications thereof can be found in, for example, (i) clustering for marketing purposes (segment your customer base into different clusters for targeted marketing) or (ii) portfolio optimization in finance (vertex corresponds to asset, with color referring to sell or buy decisions. \n", - "Again, the problem in this specific graph coloring problem is that there are $2^𝑁$ possible solutions for $N$ nodes (an exponential explosion in possibilities), making it impossible to enumerate all possible candidates for relevant system sizes. \n", - "\n", - "__Ising Hamiltonian__: Importantly, there is a fundamental correspondence between QUBO problems and Ising problems in physics. \n", - "Specifically, we can encode the Maximum Cut problem as a __minimization problem__ of an Ising Hamiltonian, where the (classical) cost function reads \n", - "\n", - "$$H_{C}=\\sum_{i>j} J_{i,j} z_{i} z_{j},$$\n", - "\n", - "with Ising variables $z_{i}=-1,1$ and the Ising matrix $J$ encoding the weights of the edges. \n", - "For the sake of this discussion, we ignore potential linear terms and constant offsets (that do not affect the optimal solution $z$ anyway). \n", - "In short, the cost Hamiltonian $H_{C}$ assigns a number to every bitstring $z=(z_{1},z_{2},\\dots)$, and we would like to find the lowest number possible. \n", - "This will be the optimal assignment and solution to our problem. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## BACKGROUND: THE QUANTUM APPROXIMATE OPTIMIZATION ALGORITHM" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this tutorial we will try to solve for the optimal _classical_ bitstring $z$ using the Quantum Approximate Optimization Algorithm (QAOA). \n", - "To this end, we first promote the classical spin variables $z_{i}=-1,1$ to quantum-mechanical variables $\\sigma_{i}^{z}$ (with the Pauli matrix $\\sigma_{i}^{z}$ representing the observable corresponding to spin along the $z$ coordinate axis in three-dimensional Euclidean space $\\mathbb{R}^{3}$). \n", - "This leads to the following quantum mechanical cost Hamiltonian encoding the optimization problem\n", - "\n", - "$$\\hat{H}_{C}=\\sum_{i>j} J_{i,j} \\sigma_{i}^{z} \\sigma_{j}^{z},$$\n", - "\n", - "which can be written as a matrix of size $(2^{N}, 2^{N})$ with diagonal elements only corresponding to all possible classical values for the cost function $H_{C}$. \n", - "The ground state of $\\hat{H}_{C}$ corresponds to the optimal solution of the classical combinatorial problem.\n", - "\n", - "__QAOA ansatz__: Finding this ground state is generically hard. \n", - "To approximate this groundstate, QAOA prepares a parametrized ansatz state (corresponding to a parameterized gate sequence), whose parameters are iteratively updated by a classical optimizer in a closed loop. \n", - "Specifically, QAOA involves a specific ansatz wavefunction parametrized by a parameter family $(\\vec{\\beta}, \\vec{\\gamma})$, embedded into a larger classical optimization loop to find the optimal values for these parameters. \n", - "As shown in Ref.[1], good approximate solutions to the problem class considered here can be found by preparing the variational state \n", - "\n", - "$$|\\gamma, \\beta \\rangle = U_{x}(\\beta_{p})U_{zz}(\\gamma_{p}) \\cdots U_{x}(\\beta_{1})U_{zz}(\\gamma_{1}) |s\\rangle$$\n", - "\n", - "with single qubit rotations induced by $U_{x}(\\beta) = \\exp(-i\\beta \\sum_{i}\\sigma_{i}^{x})$, \n", - "and interactions described by $U_{zz}(\\gamma) = \\exp(-i\\gamma H_{C})$,\n", - "starting initially from a product of $\\sigma^{x}$ eigenstates, i.e.,\n", - "$|s\\rangle =|-,-,\\dots\\rangle$, with $|-\\rangle = (|0\\rangle -|1\\rangle )/\\sqrt{2}$. \n", - "The family of states $|\\gamma, \\beta \\rangle$ is prepared by alternating single-qubit operations $U_{x}(\\beta_{p})$ with targeted spin-spin interactions generated by the cost Hamiltonian $H_{C}$. \n", - "The depth $p$ can be interpreted as a hyperparameter. \n", - "For $p$ layers of QAOA blocks, there are $2p$ classical parameters to optimize over, \n", - "since each layer $k$ is characterized by just two variational parameters, $\\gamma_{k}$ and $\\beta_{k}$. \n", - "The preparation step outlined above is followed by a measurement in the computational basis, giving a classical string $z$, with which one can evaluate the objective function $H_{C}$ of the underlying combinatorial problem at hand. \n", - "Taking several measurements shots one can build the expectation value $E(\\beta, \\gamma) = \\langle H_{C} \\rangle$ that we report as the objective function to the classical minimizer (while other choices could be possible as well). \n", - "Repeating this procedure will provide an optimized string $z$, with the quality of the result improving as the depth of the quantum circuit $\\sim 2p$ is increased [1]. \n", - "In fact, in principle (in the absence of noise and other imperfections), QAOA can reach the global optimum of any cost function in the limit $p \\rightarrow \\infty$ [1], approaching the adiabatic protocol. \n", - "Thus, in theory the computational power of QAOA increases with $p$, but in practice the number of layers that can be executed without errors on NISQ devices is limited due noise and imperfections. \n", - "\n", - "__Optimization__: Since we are primarily interested in solving the classical optimization problem, within this routine it is sufficient to keep track of the best classical bitstring. \n", - "This means that the wavefunction prepared by the quantum circuit $|\\gamma, \\beta \\rangle$ has to have some overlap with the optimal solution $|z^{*} \\rangle$ that we can read out as bitstring $z^{*}$ in the measurement shots. \n", - "To this end, in principle (i.e., without any training), we could just sample from a completely uniform state that is prepared in a superposition of all computational basis states, as prepared by applying Hadamard gates to all qubits: $|\\mathrm{uniform}\\rangle = 1/\\sqrt{2^{N}}\\sum_{i}|z_{i}\\rangle$. \n", - "In that case (assuming a single optimal solution) the success probability per shot amounts to $p_{\\mathrm{success}}=1/2^{N}$. \n", - "We can then amplify our success chances by just taking many measurement shots. \n", - "For large systems, however, this approach is not scalable as we would need to take an exponentially increasing number of measurements. \n", - "That is why we train our circuits, update the parameters, with the goal to increase our success chances to find the optimal bitstring. \n", - "We can quantify our success chances as follows [6]. \n", - "For a given wavefunction $|\\gamma, \\beta \\rangle$ the probability to find the optimal solution in a single shot is given by \n", - "\n", - "$$ p_{\\mathrm{success}}(\\gamma, \\beta) = |\\langle z^{*}|\\gamma, \\beta \\rangle |^{2},$$\n", - "\n", - "where $z^{*}$ denotes the optimal bitstring. \n", - "If we perform $M$ repeated measurements, the overall probability $P$ for observing this solution at least once is given by \n", - "\n", - "$$ P = 1 - (1-p_{\\mathrm{success}}(\\gamma, \\beta))^{M}, $$ \n", - "\n", - "since the term $(1-p_{\\mathrm{success}}(\\gamma, \\beta))^{M}$ gives the probability of _not_ obtaining $z^{*}$ in repeated $M$ trials. \n", - "Therefore, to have an overall success chance up to $\\epsilon$ close to 100%, i.e., $P \\geq 1-\\epsilon$, the number of required shots has to be \n", - "\n", - "$$ M \\geq \\frac{\\log(\\epsilon)}{\\log(1-p_{\\mathrm{success}}(\\gamma, \\beta))}.$$\n", - "\n", - "Let us illustrate this results as follows: \n", - "If we do not know anything and just resort to a uniform superposition $|\\mathrm{uniform}\\rangle$, for a small system with $N=10$ qubits we can find the optimal solutions with 80% success probability by taking at least $\\sim 1650$ shots. \n", - "For just $N=20$ qubits, however, this number amounts to $\\sim 1.7 \\times 10^{6}$, making this naive approach unfeasible. \n", - "Conversely, if we can train the quantum circuit to obtain $p_{\\mathrm{success}}(\\gamma, \\beta) \\sim 0.1$, we only need $\\sim 15$ shots to have $P\\geq 80\\%$. \n", - "Below we will track and illustrate the best classical optimum as our algorithm proceeds towards a local or (ideally) global optimum. \n", - "\n", - "__Objective function__: Finally, some more details on the definition of the cost function are in order. \n", - "Following the standard approach [1, 4], QAOA tries to minimize the expectation value $\\langle \\hat{H}_{C} \\rangle$, but does _not_ explicitly maximize the success probability [6]. \n", - "However, a low expectation value for $\\langle \\hat{H}_{C} \\rangle$ does not necessarily translate to a high success probability $p_{\\mathrm{success}}(\\gamma, \\beta)$, as can be understood from the following example:\n", - "Consider (for example) a variational state that is a linear combination of low energy excited eigenstates of the cost Hamiltonian $\\hat{H}_{C}$ other than the ground state $|z^{*}\\rangle$. \n", - "By definition, this state will have a relatively low expectation value $\\langle \\hat{H}_{C} \\rangle$ while the success probability is zero (as this low energy state does not have any overlap with the ground state). \n", - "Similarly, a variational state that is a linear combination of the ground state with very high energy eigenstates could have a high success probability $p_{\\mathrm{success}}(\\gamma, \\beta)$, while (at the same time) reporting a high cost value to the classical optimizer.\n", - "To address this issue, alternative methods for the optimization of the variational parameters have recently been proposed. \n", - "While for simplicity we follow the majority of the literature and take $\\langle \\hat{H}_{C} \\rangle$ as cost value that we report to the classical optimizer, here we do mention a potential alternative for future research: \n", - "One approach is to use the Gibbs objective function, defined as $\\mathrm{cost}=-\\mathrm{log} \\langle \\exp(-\\eta \\hat{H}_{C})\\rangle$, with the hyperparameter $\\eta>0$ [7]. \n", - "As compared to the simple expectation value $\\langle \\hat{H}_{C} \\rangle$, this definition of the cost value shows stronger rewards for low energy states, thereby increasing the success probability. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## IMPORTS and SETUP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For classical benchmarking we will be using the python library ```pyqubo```, as used in our helper script ```utils_classical```. If not already present in your virtual environment, you can install this library simply with ```pip install pyqubo```. Similarly, as ```seaborn``` are not expected to be present in the virtual environment by default, we will install them via ```pip install seaborn```. Note the ```-q``` to suppress install updates from ```pip```." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# If these have already been installed, this cell can be commented out.\n", - "!pip install pyqubo -q\n", - "!pip install seaborn -q" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# general imports\n", - "import numpy as np\n", - "from scipy.optimize import minimize\n", - "import matplotlib.pyplot as plt\n", - "import networkx as nx\n", - "import seaborn as sns\n", - "import time\n", - "from datetime import datetime\n", - "import pickle\n", - "import random\n", - "\n", - "# magic line for producing visualizations in notebook\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# fix random seed for reproducibility\n", - "seed = 42\n", - "np.random.seed(seed)\n", - "random.seed(a=seed)\n", - "\n", - "# switch to trigger writing training results to disk\n", - "store_results = False\n", - "# switch to trigger printing results of each optimization cycle\n", - "verbose = False" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# AWS imports: Import Braket SDK modules\n", - "from braket.circuits import FreeParameter\n", - "from braket.devices import LocalSimulator" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "from utils_classical import plot_colored_graph, plot_colored_graph_simple, solve_classical_ising\n", - "# auto reload external files, so that we can edit the external .py file and immediately see the changes here\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Set up device: Local Simulator\n", - "device = LocalSimulator()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "## example code for other backends\n", - "# from braket.aws import AwsDevice\n", - "# from braket.devices import Devices\n", - "## choose the on-demand simulator to run your circuit\n", - "# device = AwsDevice(Devices.Amazon.SV1)\n", - "## choose the Rigetti device to run your circuit\n", - "# device = AwsDevice(Devices.Rigetti.Ankaa2)\n", - "## choose the Ionq device to run your circuit\n", - "# device = AwsDevice(Devices.IonQ.Aria1)\n", - "## choose the IQM device to run your circuit\n", - "# device = AwsDevice(Devices.IQM.Garnet)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## PROBLEM SETUP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We consider a graph coloring problem.\n", - "Given a graph $G=(V,E)$, made of a set vertices (also called nodes) $V$ and edges $E$, our goal is to color each node red or blue, then score a point for each node that is next to a node of different color. \n", - "We strive to find the optimal coloring that scores the largest number of points.\n", - "To this end, we will address the dual problem of finding the minimum energy of the corresponding Ising Hamiltonian. \n", - "To get started, we first use the open-source ```networkx``` library to visualize the problem graph. \n", - "Feel free to play with the parameters $n$ (for the number of nodes) and $m$ (for the number of edges) below to consider other graphs of your choice. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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wR/9zLzhh4iIiMia2HShBIDpof3x2jhvk1zrb+N8MC2UayeJiIiI/pNEEARzn1JoEXaml+Pt+Hzo9EKzNus4SCVwlEqwfII/yyQRERHR77CbQgkAF6rrsPi7XCSXXoODVHLXYnn765Ge7oibHMDX3ERERER/wK4K5W0lFTewXVWO48W/oLyqDv/5L0CC34aWj/buiZkj+nM3NxEREdGfsMtC+Z80DTqUVWmg1enR3lGKgW6deAIOERERUTPYfaEkIiIiotax+V3eRERERGReLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQq/x/6+tCJfDntYQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# setup Erdos Renyi graph\n", - "n = 10 # number of nodes/vertices\n", - "m = 20 # number of edges\n", - "\n", - "# define graph object\n", - "G = nx.gnm_random_graph(n, m, seed=seed)\n", - "# positions for all nodes\n", - "pos = nx.spring_layout(G)\n", - "\n", - "# choose random weights\n", - "for (u, v) in G.edges():\n", - " G.edges[u,v]['weight'] = random.uniform(0, 1)\n", - "\n", - "# draw graph\n", - "nx.draw(G, pos)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# set Ising matrix \n", - "Jfull = nx.to_numpy_array(G)\n", - "\n", - "# get off-diagonal upper triangular matrix\n", - "J = np.triu(Jfull, k=1).astype(np.float64)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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KF9e/dwfW+Lh6maPZiF1tZqprAzh91rs4TtwtLfAl/2bwMXBEldupWLg+D1IzXh2ybWKq02x//55VbXDWw3dMWDsLl2UXKKdx+/DsZIEX3VrCGc7C1y5l47w6YeQmvUsS2UnK5UV9cdpTxE+7SAm9G2M2JgPkJD+FKt2X8NPf15R9olefQqjuvnh2/CmcLKVIDE9FxsO3MSPWwzw5dUGubz55kQKDWdwR44cQU5ODt5/X/2NyTk5OTh58iRatVJ/+ePV1C9bGx4fCCcLIMQ8HfcfeX03A7E9tAWEMz4+sKzeW9dFaE3u/V+RVbBf12Voja1ZKIT0e632e8t1XYTW3Ng3ELU+/lXXZWjNrXW6/Xug9rtLtX7MGwcHaf2Y2qbxSmGLFq9+75q1tXUZJ4REREREpCv6c/MSERERkT4wzqvHxvp6RiIiIiIqiiuFREREREUZ6YMmnBQSERERFWWk32jCy8dERERExJVCIiIiIhXGuVDIlUIiIiIi4kohERERkSo+aEJEREREvHxMREREREaLK4VERERERSiM9JU0nBQSERERFWWk9xTy8jERERERcaWQiIiISIVxLhRypZCIiIiIAJFCoVDouggiIiIifeH90WqtH/PmH/21fkxt07PLx9d1XYCW+EA4WQAh5imQn9V1EVpjJg6AcMZHeL/XTiTv1HURWhPo0h7CGR/h/V4TXh4d4oMmRERERKQvFi5cCE9PT1hYWCAoKAgnTpwose8777wDkUhUbGvfvn2pz8dJIREREVFRonLYNLRx40ZEREQgKioKp0+fhr+/P8LCwpCUlKS2/5YtW/D48WPldvHiRZiYmKB79+6lPicnhURERER6Zs6cORg0aBDCw8NRr149LFmyBFZWVlixYoXa/o6OjnB3d1du+/btg5WVFSeFRERERGUmEml/00B+fj5OnTqF0NBQZZtYLEZoaCji4+NLdYzly5ejV69esLa2LvV59exBEyIiIiIdK4evuZNKpZBKpSptEokEEomkWN+UlBTIZDK4ubmptLu5ueHq1auvPdeJEydw8eJFLF++XKMauVJIREREVM5iYmJgZ2enssXExJTLuZYvX46GDRsiMDBQo/24UkhERERUVDksmUVGRiIiIkKlTd0qIQA4OzvDxMQEiYmJKu2JiYlwd3d/5XlycnKwYcMGfPvttxrXyJVCIiIionIm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SFkA5tFnQsoCCDOP7iy6vFfrxxxar22p++bn58PKygqbNm1Cp06dlO39+/dHRkYGtm/f/sr9FQoFDhw4gI8++gjbtm3De++9V6rzavzdx/b29pg2bRqmTZum6a5ERERERkkqlRZ700pJt9OlpKRAJpPBzc1Npd3NzQ1Xr14t8RyZmZnw8PCAVCqFiYkJFi1aVOoJIWAEL68mIiIi0kR5vJKmIt68UqlSJZw9exb//vsvvv/+e0RERODQoUOl3l/jlUIiIiIi0kxkZCQiIiJU2kp66NbZ2RkmJiZITExUaU9MTIS7u3uJ5xCLxcoHfgMCAnDlyhXExMQUu9+wxP1L1YuIiIjISJTHK2kkEglsbW1VtpImhebm5mjSpAni4uKUbXK5HHFxcQgODi51DrlcrtGXg3ClkIiIiKgIffhauoiICPTv3x9NmzZFYGAg5s2bh5ycHOXTyP369YOHh4fyEnRMTAyaNm2KWrVqQSqVIjY2FmvWrMHixYtLfU5OComIiIj0TM+ePZGcnIzJkycjISEBAQEB2L17t/Lhk/v370MsfnHBNycnB0OHDsWDBw9gaWkJX19frF27Fj179iz1OTV+JU35Esrj9EJ8NQDz6C8h5RFSFoB59JmQsgDCzKM7K6/v0foxw31K965AXeJKIREREVER+vDyal3ggyZERERExJVCIiIioqK4UkhERERERosrhURERERFmIj06BncCsRJIREREVERxnoZ1VhzExEREVERXCkkIiIiKoIPmhARERGR0dKzbzQhIiIi0q1Nd3Zr/ZjdvN7X+jG1Tc8uHwvlK3qE+HVDzKO/hJRHSFkA5tFnPqju/z9dF6E1989NhOd3e3VdhtbcndRWp+c31qePefmYiIiIiPRtpZCIiIhIt/igCREREREZLa4UEhERERVhrCuFnBQSERERFWGsk0JePiYiIiIirhQSERERFWXClUIiIiIiMlZcKSQiIiIqQmykL6/mpJCIiIioCGO9jGqsuYmIiIioCK4UEhERERXBV9IQERERkdEympXCdet2YvnyLUhOToevrxcmTfoCfn4+ui6rzISUR0hZAObRd0LKI6QsgGHk6dezCb7oHwwXZxtcuZ6IydP24NzFRyX2H/hxID7p0QQe7rZIy8hF7L4rmD7/AKT5MgBAYOPqGDygGRrWrQw310r47KvfsPfg9QrJ0rdp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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# plot Ising matrix\n", - "plt.figure(1, figsize=[7, 5])\n", - "sns.heatmap(J, annot=True, linewidths=.5, cmap=\"YlGnBu\", annot_kws = {'alpha': 1})\n", - "plt.title('Ising distance matrix');\n", - "plt.tight_layout();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## IMPLEMENTATION OF QAOA WITH BRAKET " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we load a set of useful helper functions that we will explain in detail below. \n", - "Specifically in ```utils_qaoa.py``` we provide simple building blocks for the core modules of our QAOA algorithm, that is (i) a function called ```circuit``` that defines the parametrized ansatz, (ii) a function called ```objective_function``` that takes a list of variational parameters as input, and returns the cost associated with those parameters and finally (iii) a function ```train``` to run the entire QAOA algorithm for given ansatz. \n", - "This way we can solve the problem in a clean and modular approach.\n", - "Here, we show in markdown the definition of the parametrized QAOA circuit. \n", - "For more details, see the corresponding file ```utils_qaoa.py```. " - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "from utils_qaoa import circuit, train \n", - "# auto reload external files, so that we can edit the external .py file and immediately see the changes here\n", - "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```python\n", - "# function to implement evolution with driver Hamiltonian\n", - "def driver(beta, n_qubits):\n", - " \"\"\"\n", - " Returns circuit for driver Hamiltonian U(Hb, beta)\n", - " \"\"\"\n", - " # instantiate circuit object\n", - " circ = Circuit()\n", - " \n", - " for qubit in range(n_qubits):\n", - " gate = Circuit().rx(qubit, 2*beta)\n", - " circ.add(gate)\n", - " \n", - " return circ\n", - "\n", - "\n", - "# helper function for evolution with cost Hamiltonian\n", - "def cost_circuit(gamma, n_qubits, ising):\n", - " \"\"\"\n", - " returns circuit for evolution with cost Hamiltonian\n", - " \"\"\"\n", - " # instantiate circuit object\n", - " circ = Circuit()\n", - "\n", - " # get all non-zero entries (edges) from Ising matrix \n", - " idx = ising.nonzero()\n", - " edges = list(zip(idx[0], idx[1]))\n", - " \n", - " for qubit_pair in edges:\n", - " # get interaction strength\n", - " int_strength = ising[qubit_pair[0], qubit_pair[1]]\n", - " # for Rigetti we decompose ZZ using CNOT gates\n", - " if 'Ankaa' in device.name:\n", - " gate = ZZgate(qubit_pair[0], qubit_pair[1], gamma*int_strength)\n", - " circ.add(gate)\n", - " # classical simulators and IonQ support ZZ gate\n", - " else:\n", - " gate = Circuit().zz(qubit_pair[0], qubit_pair[1], angle=2*gamma*int_strength)\n", - " circ.add(gate)\n", - "\n", - " return circ\n", - "\n", - "\n", - "# function to build the QAOA circuit with depth p\n", - "def circuit(params, n_qubits, ising):\n", - " \"\"\"\n", - " function to return full QAOA circuit\n", - " \"\"\"\n", - "\n", - " # initialize qaoa circuit with first Hadamard layer: for minimization start in |->\n", - " circ = Circuit()\n", - " X_on_all = Circuit().x(range(0, n_qubits))\n", - " circ.add(X_on_all)\n", - " H_on_all = Circuit().h(range(0, n_qubits))\n", - " circ.add(H_on_all)\n", - "\n", - " # setup two parameter families\n", - " circuit_length = int(len(params) / 2)\n", - " gammas = params[:circuit_length]\n", - " betas = params[circuit_length:]\n", - "\n", - " # add circuit layers\n", - " for mm in range(circuit_length):\n", - " circ.add(cost_circuit(gammas[mm], n_qubits, ising))\n", - " circ.add(driver(betas[mm], n_qubits))\n", - "\n", - " return circ\n", - "\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## VISUALIZATION OF THE QAOA ANSATZ" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let us first visualize our parametrized QAOA ansatz for a small number of qubits and fixed (i.e., not optimized) parameters. \n", - "For convenience, the parameters are displayed in the circuit (up to a factor of $2$ we have added in our ansatz definition). \n", - "First we prepare the state $|0,0,\\dots\\rangle \\rightarrow |-,-,\\dots\\rangle$, with the superposition state $|-\\rangle = (|0\\rangle -|1\\rangle )/\\sqrt{2}$. \n", - "Following the discussion above, we choose to start out with this state as it is the minimal energy state of the simple driver Hamiltonian $H_{B}$. \n", - "This state preparation is followed by one layer of the QAOA ansatz, consisting of evolution with the cost Hamiltonian by $\\exp(-i\\gamma H_{C})= \\prod_{j,l}\\exp(-i\\gamma J_{j,l}\\sigma_{j}^{z}\\sigma_{l}^{z}) = \\prod_{j,l} ZZ_{j,l}(2\\gamma J_{j,l})$, followed by the single-qubit driving term, $\\exp(-i\\beta H_{B})= \\prod_{j} \\exp(-i\\beta \\sigma_{j}^{x})= \\prod_{j} R_{j}^{(x)}(2\\beta)$.\n", - "Note that the circuit definition depends on the ```device``` object, as the implementation of the ZZ gate depends on the specific gate set supported by the device. " - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Printing test circuit:\n", - "T : |0|1| 2 | 3 |\n", - " \n", - "q0 : -X-H-ZZ(2*gamma)-Rx(2*beta)-\n", - " | \n", - "q1 : -X-H-ZZ(2*gamma)-Rx(2*beta)-\n", - "\n", - "T : |0|1| 2 | 3 |\n", - "\n", - "Unassigned parameters: [beta, gamma].\n" - ] - } - ], - "source": [ - "# create parameters\n", - "gammas = [FreeParameter('gamma')]\n", - "betas = [FreeParameter('beta')]\n", - "params = gammas + betas\n", - "\n", - "# for demonstration purposes use small Ising matrix\n", - "J_sub = np.array([[0, 1], [0, 0]])\n", - "N = J_sub.shape[0]\n", - "\n", - "# get circuit ansatz\n", - "my_simple_circuit = circuit(params, device, N, J_sub)\n", - "\n", - "# print test ansatz circuit\n", - "print('Printing test circuit:')\n", - "print(my_simple_circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We see that our ansatz produces the expected result for shallow QAOA with $p=1$. \n", - "We run one more sanity check for $p=2$ below. " - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Printing test circuit:\n", - "T : |0|1| 2 | 3 | 4 | 5 |\n", - " \n", - "q0 : -X-H-ZZ(2*gamma_1)-Rx(2*beta_1)-ZZ(2*gamma_2)-Rx(2*beta_2)-\n", - " | | \n", - "q1 : -X-H-ZZ(2*gamma_1)-Rx(2*beta_1)-ZZ(2*gamma_2)-Rx(2*beta_2)-\n", - "\n", - "T : |0|1| 2 | 3 | 4 | 5 |\n", - "\n", - "Unassigned parameters: [beta_1, beta_2, gamma_1, gamma_2].\n" - ] - } - ], - "source": [ - "# set number of qubits and fix parameters\n", - "gammas = [FreeParameter('gamma_1'), FreeParameter('gamma_2')]\n", - "betas = [FreeParameter('beta_1'), FreeParameter('beta_2')]\n", - "params = gammas + betas\n", - "\n", - "# for demonstration purposes use small Ising matrix\n", - "J_sub = np.array([[0, 1], [0, 0]])\n", - "N = J_sub.shape[0]\n", - "\n", - "# get circuit ansatz\n", - "my_simple_circuit = circuit(params, device, N, J_sub)\n", - "\n", - "# print test ansatz circuit\n", - "print('Printing test circuit:')\n", - "print(my_simple_circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## QAOA SIMULATION ON LOCAL SCHROEDINGER SIMULATOR" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are now all set to run some QAOA simulation experiments. \n", - "First of all, you can play and experiment yourself with the number of qubits $N$. \n", - "Secondly, you may also experiment with the classical optimizer. \n", - "Since we are using an off-the-shelf, black-box ```scipy``` minimizer (as described in more detail [here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html)), you can simply swap between different optimizers by setting the ```OPT_METHOD``` parameter below. \n", - "Some popular options readily available within this library include *Nelder-Mead*, *BFGS* and *COBYLA*. \n", - "As a precautionary warning, note that the classical optimization step may get stuck in a local optimum, rather than finding the global minimum for our parametrized QAOA ansatz wavefunction. \n", - "To address this issue, we may run several optimization loops, starting from different random parameter seeds. \n", - "While this brute-force approach does not provide any guarantee to find the global optimum, from a pragmatic point of view at least it does increase the odds of finding an acceptable solution, at the expense of potentially having to run many more circuits on the simulator or QPU, respectively.\n", - "Finally, the optimization loop may require the execution of many individual quantum tasks (i.e., single circuit executions for fixed parameters). \n", - "For example, when choosing the classical [Powell](https://docs.scipy.org/doc/scipy/reference/optimize.minimize-powell.html#optimize-minimize-powell) optimizer for the graph considered here, we find $\\sim 270$ cycles in the for loop. \n", - "For the local simulator device chosen here by default this is not an issue, but if you run this algorithm on any QPU you may want to adjust the ```maxfev``` parameter to control the maximum allowed number function evaluations (compare comment in the next code block below)." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "##################################################################################\n", - "# set up hyperparameters\n", - "##################################################################################\n", - "\n", - "# User-defined hypers\n", - "DEPTH = 3 # circuit depth for QAOA\n", - "SHOTS = 1000 # number measurements to make on circuit\n", - "OPT_METHOD = 'COBYLA' # SLSQP, COBYLA, Nelder-Mead, BFGS, Powell, ...\n", - "\n", - "# set up the problem\n", - "n_qubits = J.shape[0]\n", - "\n", - "# initialize reference solution (simple guess)\n", - "bitstring_init = -1 * np.ones([n_qubits])\n", - "energy_init = np.dot(bitstring_init, np.dot(J, bitstring_init))\n", - "\n", - "# set tracker to keep track of results\n", - "tracker = {\n", - " 'count': 1, # Elapsed optimization steps\n", - " 'optimal_energy': energy_init, # Global optimal energy\n", - " 'opt_energies': [], # Optimal energy at each step\n", - " 'global_energies': [], # Global optimal energy at each step\n", - " 'optimal_bitstring': bitstring_init, # Global optimal bitstring\n", - " 'opt_bitstrings': [], # Optimal bitstring at each step\n", - " 'costs': [], # Cost (average energy) at each step\n", - " 'res': None, # Quantum result object\n", - " 'params': [] # Track parameters\n", - "}\n", - "\n", - "# set options for classical optimization\n", - "options = {'disp': True, 'maxiter': 50}" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Circuit depth hyperparameter: 3\n", - "Problem size: 10\n", - "Starting the training.\n", - "====================================================================\n", - "OPTIMIZATION for circuit depth p=3\n", - "Param \"verbose\" set to False. Will not print intermediate steps.\n", - "====================================================================\n", - "Final average energy (cost):\n", - " Return from subroutine COBYLA because the MAXFUN limit has been reached.\n", - " -0.586455292294228\n", - "Final angles: [5.78684986 4.70523429 6.47840919 0.25681156 1.2539245 2.7942261 ]\n", - "Training complete.\n", - "Code execution time [sec]: 6.3666791915893555\n", - "Optimal energy: -6.486032631497276\n", - "Optimal classical bitstring: [-1 1 -1 -1 1 -1 1 1 -1 -1]\n", - "\n", - " NFVALS = 50 F =-5.864553E-01 MAXCV = 0.000000E+00\n", - " X = 5.786850E+00 4.705234E+00 6.478409E+00 2.568116E-01 1.253925E+00\n", - " 2.794226E+00\n" - ] - } - ], - "source": [ - "##################################################################################\n", - "# run QAOA optimization on graph \n", - "##################################################################################\n", - "\n", - "print('Circuit depth hyperparameter:', DEPTH)\n", - "print('Problem size:', n_qubits)\n", - "\n", - "# kick off training\n", - "start = time.time()\n", - "result_energy, result_angle, tracker = train(\n", - " device = device, options=options, p=DEPTH, ising=J, n_qubits=n_qubits, n_shots=SHOTS, \n", - " opt_method=OPT_METHOD, tracker=tracker, verbose=verbose)\n", - "end = time.time()\n", - "\n", - "# print execution time\n", - "print('Code execution time [sec]:', end - start)\n", - "\n", - "# print optimized results\n", - "print('Optimal energy:', tracker['optimal_energy'])\n", - "print('Optimal classical bitstring:', tracker['optimal_bitstring'])\n", - "\n", - "##################################################################################\n", - "# Compute output and dump to pickle\n", - "##################################################################################\n", - "\n", - "if store_results:\n", - " out = {'p': DEPTH, 'N': n_qubits,\n", - " 'ENERGY_OPTIMAL': tracker['optimal_energy'], 'BITSTRING': tracker['optimal_bitstring'],\n", - " 'result_energy': result_energy, 'result_angle': result_angle}\n", - "\n", - " # store results: dump output to pickle with timestamp in filename\n", - " time_now = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')\n", - " results_file = 'results-'+time_now+'.pkl'\n", - " print(f'Writing results to file: {results_file}')\n", - " pickle.dump(out, open(results_file, \"wb\"))\n", - " \n", - " # you can load results as follows\n", - " # out = pickle.load(open(results_file, \"rb\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## POSTPROCESSING AND COMPARISON OF OUR QAOA RESULTS WITH CLASSICAL RESULTS" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this section we visualize the results we have found with QAOA. \n", - "Specifically, we display the results found for the variational parameters $\\beta$ and $\\gamma$ for every layer in our QAOA ansatz. \n", - "Moreover, we show the solution to our graph coloring problem with every node colored either red or blue (recall that there are just two colors since we solve a _binary_ optimization problem).\n", - "Finally, we compare these results to results found classically using the open-source ```pyqubo``` package. \n", - "Ideally, the two results should agree with each other but this is not necessarily the case for several reasons: \n", - "First of all, for the original small toy problem we have set up there are several degenerate classical solutions with the same optimal quality. \n", - "The classical and the QAOA approach may find solutions with different coloring configurations but the same quality (that is energy). \n", - "Secondly, with QAOA we are not guaranteed to find the optimal solutions. \n", - "Specifically, the deeper the circuit, the harder the classical optimization problem, and we may get stuck in a local rather than global optimum. \n", - "One brute-force approach is then to just re-run QAOA with different random initial seeds for the parameters $(\\beta, \\gamma)$." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimization on graph with n=10 vertices, m=20 edges, optimized with COBYLA and 1000 shots per call; seed=42.\n" - ] - }, - { - "data": { - "image/png": "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KDAwUH/84x/18MMPa9y4cS4vsiYyDEMFRSWeLgMAAI8LqF1LFovFY+d3OgzVrVvXMU4oLCxMx44dU9u2bSVJZ8+edW11NVhBUYliXl7n6TIAAPC4b/54n+r43dQwZpdw+sxdu3bVF198odtuu03333+/pkyZov3792vFihXq2rWrO2oEAABwm0pNuvhLx48fV35+vjp06KCLFy9qypQp+vLLL9WqVSvNmzdPkZGR7qrVI9w16SK3yQAAuMIdt8mc+f12OgyZDTNQAwDgfZz5/Xb6abKdO3dqx44d16zfsWOHvv76a2cPBwAA4FFOh6EJEyYoMzPzmvVZWVmaMGGCS4oqz5o1axQXF6eAgADZbDYNGjSowvajR4+WxWIps/Tv39+tNQIAAO/i9ADqb7755rqTK3bu3FnffPONS4q6nuXLl2vMmDGaNWuWevfureLiYh04cOCG+/Xv31+LFi1yfLZarW6rEQAAeB+nw5DVatUPP/yg6OjoMuuzs7Pl6+uex+KKi4s1ceJEpaamKiEhwbE+JibmhvtarVY1adKk0ucqLCxUYWGh43NeXp5zxQIAAK/i9G2yfv36KSkpSbm5uY51P/30k1588UXde++9Li3uqvT0dGVlZcnHx0edO3dWWFiYBgwYUKkrQ5s3b1ajRo3UunVrjRs3TufOnauwfUpKioKDgx1LRESEq74GAACohpx+miwrK0t33323zp07p86dO0uS9uzZo8aNG2vDhg1uCQ9Lly7VyJEj1bx5c82bN09RUVGaO3eu1q9fryNHjqh+/frl7lenTh21aNFCx44d04svvqjAwEBt27ZNtWrVuu4+17syFBERwdNkAAB4Ebc/Wn/x4kW9//772rt3rwICAtShQweNHDlStWvXduo4iYmJmj17doVtDh06pPT0dD322GN666239Pvf/17SldDSrFkzvfLKK3rqqacqdb7jx4/rV7/6lT777DP16dOnUvvwaD0AAN7Hmd/vmxrkU7duXUcouRVTpkzR6NGjK2wTHR2t7OxsSWXHCFmtVkVHRysjI6PS54uOjlbDhg119OjRSochAABQs1UqDK1atUoDBgxQ7dq1tWrVqgrbPvTQQ5U+eWhoqEJDQ2/YLjY2VlarVXa7XT169JAkFRUV6eTJk07NeP3999/r3LlzCgsLq/Q+AACgZqvUbTIfHx/l5OSoUaNG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jh3ria8AAACqIa+YZ8iTmGcIAADvU+PmGQIAAHAXwhAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1X08XUN0ZhiFJysvL83AlAACgsq7+bl/9Ha8IYegGLly4IEmKiIjwcCUAAMBZFy5cUHBwcIVtLEZlIpOJlZaW6tSpU6pXr54sFkul9snLy1NERIQyMzMVFBTk5gpBf1ct+rtq0d9Vi/6uWu7sb8MwdOHCBYWHh8vHp+JRQVwZugEfHx81a9bspvYNCgriP6YqRH9XLfq7atHfVYv+rlru6u8bXRG6igHUAADA1AhDAADA1AhDbmC1WpWcnCyr1erpUkyB/q5a9HfVor+rFv1dtapLfzOAGgAAmBpXhgAAgKkRhgAAgKkRhgAAgKkRhgAAgKkRhtxgwYIFioqKkr+/v+Li4vTVV195uqQa4f/9v/+nBx98UOHh4bJYLPr3v/9dZrthGHr55ZcVFhamgIAA9e3bV99++61niq0BUlJS1KVLF9WrV0+NGjXSoEGDZLfby7T5+eefNWHCBDVo0ECBgYEaOnSofvjhBw9V7N3efPNNdejQwTH5XLdu3fTpp586ttPX7vPqq6/KYrFo0qRJjnX0t2vNmDFDFoulzNKmTRvHdk/3N2HIxT788ENNnjxZycnJSk9PV8eOHXXffffp9OnTni7N6128eFEdO3bUggULrrt9zpw5ev3117Vw4ULt2LFDdevW1X333aeff/65iiutGbZs2aIJEyZo+/bt2rBhg4qKitSvXz9dvHjR0ea5557TJ598omXLlmnLli06deqUhgwZ4sGqvVezZs306quvateuXfr666/Vu3dvPfzwwzp48KAk+tpddu7cqbfeeksdOnQos57+dr22bdsqOzvbsXzxxReObR7vbwMudeeddxoTJkxwfC4pKTHCw8ONlJQUD1ZV80gyVq5c6fhcWlpqNGnSxEhNTXWs++mnnwyr1Wp88MEHHqiw5jl9+rQhydiyZYthGFf6t3bt2sayZcscbQ4dOmRIMrZt2+apMmsUm81mvPPOO/S1m1y4cMFo1aqVsWHDBqNnz57GxIkTDcPg37Y7JCcnGx07drzuturQ31wZcqHLly9r165d6tu3r2Odj4+P+vbtq23btnmwsprvxIkTysnJKdP3wcHBiouLo+9dJDc3V5JUv359SdKuXbtUVFRUps/btGmj5s2b0+e3qKSkREuXLtXFixfVrVs3+tpNJkyYoAceeKBMv0r823aXb7/9VuHh4YqOjtZjjz2mjIwMSdWjv3lRqwudPXtWJSUlaty4cZn1jRs31uHDhz1UlTnk5ORI0nX7/uo23LzS0lJNmjRJ3bt3V7t27SRd6XM/Pz+FhISUaUuf37z9+/erW7du+vnnnxUYGKiVK1cqJiZGe/bsoa9dbOnSpUpPT9fOnTuv2ca/bdeLi4vT4sWL1bp1a2VnZ2vmzJn6zW9+owMHDlSL/iYMAbihCRMm6MCBA2Xu8cP1WrdurT179ig3N1cfffSRRo0apS1btni6rBonMzNTEydO1IYNG+Tv7+/pckxhwIABjr87dOiguLg4RUZG6l//+pcCAgI8WNkV3CZzoYYNG6pWrVrXjID/4Ycf1KRJEw9VZQ5X+5e+d72nn35aq1ev1qZNm9SsWTPH+iZNmujy5cv66aefyrSnz2+en5+fWrZsqdjYWKWkpKhjx476y1/+Ql+72K5du3T69Gndfvvt8vX1la+vr7Zs2aLXX39dvr6+aty4Mf3tZiEhIfr1r3+to0ePVot/34QhF/Lz81NsbKw2btzoWFdaWqqNGzeqW7duHqys5mvRooWaNGlSpu/z8vK0Y8cO+v4mGYahp59+WitXrlRaWppatGhRZntsbKxq165dps/tdrsyMjLocxcpLS1VYWEhfe1iffr00f79+7Vnzx7Hcscdd+ixxx5z/E1/u1d+fr6OHTumsLCw6vHvu0qGaZvI0qVLDavVaixevNj45ptvjN///vdGSEiIkZOT4+nSvN6FCxeM3bt3G7t37zYkGfPmzTN2795tfPfdd4ZhGMarr75qhISEGB9//LGxb98+4+GHHzZatGhhFBQUeLhy7zRu3DgjODjY2Lx5s5Gdne1YLl265GgzduxYo3nz5kZaWprx9ddfG926dTO6devmwaq9V2JiorFlyxbjxIkTxr59+4zExETDYrEY69evNwyDvna3Xz5NZhj0t6tNmTLF2Lx5s3HixAlj69atRt++fY2GDRsap0+fNgzD8/1NGHKDN954w2jevLnh5+dn3Hnnncb27ds9XVKNsGnTJkPSNcuoUaMMw7jyeP1LL71kNG7c2LBarUafPn0Mu93u2aK92PX6WpKxaNEiR5uCggJj/Pjxhs1mM+rUqWMMHjzYyM7O9lzRXuyJJ54wIiMjDT8/PyM0NNTo06ePIwgZBn3tbv8dhuhv1xo+fLgRFhZm+Pn5GU2bNjWGDx9uHD161LHd0/1tMQzDqJprUAAAANUPY4YAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAuF1UVJTmz59/S8eYMWOGOnXq5JJ6ynPy5ElZLBbt2bPHredxp5rwHYCqxgzUAFxm8eLFmjRp0jVvnz5z5ozq1q2rOnXq3PSx8/PzVVhYqAYNGtxilVeMHj1aP/30k/7973871pWUlOjMmTNq2LChfH19XXKeqnby5Em1aNFCu3fvdnt4BGoK7/yvHYBXCQ0NveVjBAYGKjAw0AXVlK9WrVpq0qSJW88BoPrhNhkASVJhYaGeffZZNWrUSP7+/urRo4d27tzp2L5582ZZLBatWbNGHTp0kL+/v7p27aoDBw44tj/++OPKzc2VxWKRxWLRjBkzJF17m8xiseitt97SwIEDVadOHd12223atm2bjh49ql69eqlu3bq66667dOzYMcc+/32b7Oo5frlERUVJunKFJyEhQS1atFBAQIBat26tv/zlL2WOtWTJEn388ceOfTdv3nzdW0xbtmzRnXfeKavVqrCwMCUmJqq4uNixvVevXnr22Wc1depU1a9fX02aNHF874q89957atu2reO4Tz/9tCTpiSee0MCBA8u0LSoqUqNGjfTuu+9KkkpLSzVnzhy1bNlSVqtVzZs315///Odyz3XgwAENGDBAgYGBaty4seLj43X27Nkb1giYRpW9EhZAtfbss88a4eHhxn/+8x/j4MGDxqhRowybzWacO3fOMAzD2LRpkyHJuO2224z169cb+/btMwYOHGhERUUZly9fNgoLC4358+cbQUFBRnZ2tpGdnW1cuHDBMAzDiIyMNF577TXHuSQZTZs2NT788EPDbrcbgwYNMqKioozevXsba9euNb755huja9euRv/+/R37JCcnGx07dnR8vnqO7Oxs4+jRo0bLli2N+Ph4wzAM4/Lly8bLL79s7Ny50zh+/Ljxz3/+06hTp47x4YcfGoZhGBcuXDAeeeQRo3///o5jFBYWGidOnDAkGbt37zYMwzC+//57o06dOsb48eONQ4cOGStXrjQaNmxoJCcnO+ro2bOnERQUZMyYMcM4cuSIsWTJEsNisZR54/x/+9vf/mb4+/sb8+fPN+x2u/HVV185+mfr1q1GrVq1jFOnTjnar1ixwqhbt66jP6dOnWrYbDZj8eLFxtGjR43PP//c+L//+z/DMIxrvsOPP/5ohIaGGklJScahQ4eM9PR049577zXuueeeSv7LAGo+whAAIz8/36hdu7bx/vvvO9ZdvnzZCA8PN+bMmWMYxv8fhpYuXepoc+7cOSMgIMARMhYtWmQEBwdfc/zrhaHp06c7Pm/bts2QZLz77ruOdR988IHh7+/v+PzfYeiq0tJSY/DgwUZsbKxx6dKlcr/jhAkTjKFDhzo+jxo1ynj44YfLtPnvIPHiiy8arVu3NkpLSx1tFixYYAQGBholJSWGYVwJQz169ChznC5duhgvvPBCubWEh4cb06ZNK3d7TEyMMXv2bMfnBx980Bg9erRhGIaRl5dnWK1WR/j5b//9Hf70pz8Z/fr1K9MmMzPTkGTY7fZyawDMhNtkAHTs2DEVFRWpe/fujnW1a9fWnXfeqUOHDpVp261bN8ff9evXV+vWra9pUxkdOnRw/N24cWNJUvv27cus+/nnn5WXl1fhcV588UVt27ZNH3/8sQICAhzrFyxYoNjYWIWGhiowMFBvv/22MjIynKrx0KFD6tatmywWi2Nd9+7dlZ+fr++///6630WSwsLCdPr06ese8/Tp0zp16pT69OlT7nmffPJJLVq0SJL0ww8/6NNPP9UTTzzhqKmwsLDC/X9p79692rRpk2PMVWBgoNq0aSNJZW5DAmbGAGoAHlG7dm3H31fDxvXWlZaWlnuMf/7zn3rttde0efNmNW3a1LF+6dKl+sMf/qC5c+eqW7duqlevnlJTU7Vjxw5Xf41r6r5ae3l1/zKwled3v/udEhMTtW3bNn355Zdq0aKFfvOb31R6/1/Kz8/Xgw8+qNmzZ1+zLSwszKljATUVV4YA6Fe/+pX8/Py0detWx7qioiLt3LlTMTExZdpu377d8fePP/6oI0eO6LbbbpMk+fn5qaSkpEpq3rZtm5588km99dZb6tq1a5ltW7du1V133aXx48erc+fOatmy5TVXQSpT69WB3cYvZiDZunWr6tWrp2bNmt1U3fXq1VNUVJQ2btxYbpsGDRpo0KBBWrRokRYvXqzHH3/csa1Vq1YKCAiocP9fuv3223Xw4EFFRUWpZcuWZZa6deve1HcAahrCEADVrVtX48aN0/PPP6+1a9fqm2++0ZgxY3Tp0iUlJCSUafvHP/5RGzdu1IEDBzR69Gg1bNhQgwYNknTlqbH8/Hxt3LhRZ8+e1aVLl9xSb05OjgYPHqwRI0bovvvuU05OjnJycnTmzBlJVwLD119/rXXr1unIkSN66aWXyjwZd7XWffv2yW636+zZsyoqKrrmPOPHj1dmZqaeeeYZHT58WB9//LGSk5M1efJk+fjc/P8+Z8yYoblz5+r111/Xt99+q/T0dL3xxhtl2jz55JNasmSJDh06pFGjRjnW+/v764UXXtDUqVP197//XceOHdP27dsdT5r9twkTJuj8+fMaOXKkdu7cqWPHjmndunV6/PHHqyy4AtUdYQiAJOnVV1/V0KFDFR8fr9tvv11Hjx7VunXrZLPZrmk3ceJExcbGKicnR5988on8/PwkSXfddZfGjh2r4cOHKzQ0VHPmzHFLrYcPH9YPP/ygJUuWKCwszLF06dJFkvTUU09pyJAhGj58uOLi4nTu3DmNHz++zDHGjBmj1q1b64477lBoaGiZq2JXNW3aVP/5z3/01VdfqWPHjho7dqwSEhI0ffr0W6p/1KhRmj9/vv72t7+pbdu2GjhwoL799tsybfr27auwsDDdd999Cg8PL7PtpZde0pQpU/Tyyy/rtttu0/Dhw8sdoxQeHq6tW7eqpKRE/fr1U/v27TVp0iSFhITcUqADahJmoAZQKZs3b9Y999yjH3/8USEhIZ4up8bLz89X06ZNtWjRIg0ZMsTT5QA1GgOoAaAaKS0t1dmzZzV37lyFhITooYce8nRJQI1HGAKAaiQjI0MtWrRQs2bNtHjxYq99RxrgTbhNBgAATI3RcwAAwNQIQwAAwNQIQwAAwNQIQwAAwNQIQwAAwNQIQwAAwNQIQwAAwNQIQwAAwNT+PyAAIEDvTGwgAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# visualize the optimization process\n", - "cycles = np.arange(1, tracker['count'])\n", - "optim_classical = tracker['global_energies']\n", - "\n", - "# print information\n", - "info = 'Optimization on graph with n={} vertices, m={} edges, optimized with {} and {} shots per call; seed={}.'\n", - "print(info.format(n, m, OPT_METHOD, SHOTS, seed))\n", - "\n", - "plt.plot(cycles, optim_classical)\n", - "plt.xlabel('optimization cycle')\n", - "plt.ylabel('best classical minimum')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Optimal energy found with QAOA: -6.486032631497276\n", - "Optimal bit-string found with QAOA: [-1 1 -1 -1 1 -1 1 1 -1 -1]\n" - ] - } - ], - "source": [ - "# print the optimal energy found with QAOA \n", - "print('Optimal energy found with QAOA:', tracker['optimal_energy'])\n", - "# print the corresponding bitstring\n", - "print('Optimal bit-string found with QAOA:', tracker['optimal_bitstring'])" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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evvttxEdHY333nsPBgYGqvJhw4bhP//5T5cG15YtW7Zg/vz52LJlC6ZMmXLD+pWVlUhLS4OTk5PWYyMiIqLeQeMEaNOmTfjqq6/w6KOPqq36CgwMxNmzZzVqq7KyEklJSUhKSgIApKenIykpSTVpeenSpZg7d66q/ubNmzF37lysW7cOISEhyMvLQ15eHsrKylR1Xn75ZRw4cAAZGRmIi4vD/fffD5lMhtmzZ2v6UomIiKiP0jgBysnJgbe3d6typVKJhoYGjdpKSEjA8OHDVUvYo6KiMHz4cCxbtgwAkJubq7aC66uvvkJjYyOee+45ODk5qT5efPFFVZ3Lly9j9uzZ8PX1xYwZM2BjY4PDhw/Dzs5O05dKREREfZTGq8D8/Pzw999/w8PDQ618x44danvxdMa4cePQ0Rzs6OhotcedOWpj69atGsVARERE/Y/GCdCyZcsQGRmJnJwcKJVK/Pjjjzh37hw2bdqEX3/9VRsxEhEREXUpjYfApk2bhl9++QV79+6FiYkJli1bhjNnzuCXX37BxIkTtREjERERUZe6pX2A+ipN9hEgIiKinkGr+wARERER9XadmgNkZWUFiUTSqQavXr16SwERERERaVunEqDrT2EnIiIi6s06lQBFRkZqOw4iIiKibqPxMvjy8vI2yyUSCeRyudrxGEREREQ9kcYJkKWlZYfzgVxdXTFv3jwsX74cUinnWBMREVHPo3ECFB0djX//+9+YN28egoODAQBHjx5FTEwMXn/9dRQWFmLt2rWQy+V47bXXujxgIiIiolulcQIUExODdevWYcaMGaqyqVOnwt/fH19++SViY2Ph7u6Ot99+mwkQERER9Ugaj1HFxcW1eebX8OHDER8fDwC47bbb1A4xJSIiIupJNE6A3NzcsGHDhlblGzZsgJubGwCguLgYVlZWtx4dERERkRZoPAS2du1aPPzww/j9998xevRoAEBCQgLOnj2LHTt2AACOHTuGmTNndm2kRERERF3kps4CS09Px5dffonz588DAHx9ffH000/D09Ozq+PTCZ4FRkRE1Pto8v7Nw1DbwASIiIio99Hk/VvjITAAKC0txdGjR1FQUAClUql2be7cuTfTJBEREVG30TgB+uWXX/Doo4+isrIS5ubmapsiSiQSJkBERETU42m8Cmzx4sV4/PHHUVlZidLSUpSUlKg+eBI8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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# get results for variational angles\n", - "gamma = result_angle[:DEPTH]\n", - "beta = result_angle[DEPTH:]\n", - "# get array [1, 2, ..., p]\n", - "pa = np.arange(1, DEPTH + 1)\n", - "\n", - "plt.figure(2)\n", - "plt.plot(pa, gamma / np.pi, '-o', label='gamma')\n", - "plt.plot(pa, beta / np.pi, '-s', label='beta')\n", - "plt.xlabel('circuit depth (layer) p')\n", - "plt.ylabel('optimal angles [pi]')\n", - "plt.xticks(pa)\n", - "plt.legend(title='Variational QAOA angles:', loc='upper left')\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Minimal energy found with QAOA: -6.486032631497276\n" - ] - }, - { - "data": { - "image/png": "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GdtxiIiI3JBbT4UFf3+EPPvMmI8T/KuNDAJEROS13HplABjcsOjyTx+CoawMkBx71HBYSiXUCQmI2P8X6z0HRERE3sbtwwAwuCNhx/fvhdTW5rxAoFRCCA5GxP6/QDVrlnPOSURE5IHc+jLBNcrISEz58/tQRkWNar+Cv59QCSEkBFP27mEQICIir+cRYQAAVDNnImL/X+CryRl8YRTbCvukLEbE/+2HOi7OSdURERF5Lo+4THA9WZbRv+d9dD/7HOSensH9BIZ7/FChAGQZioAABD/5awSu/kc+RkhERHSVx4WBa+SBAQzs/wi9b70N06lTgy8Kwt83G7JYrCFBNX8+gtashv/990EIDHRRxURERO7JY8PA9Sw6HUx1dTD97TQsOt3gKkBgINQJCfBZkAQhNNTVJRIREbmtCREGiIiIaOR44ZyIiMjLMQwQERF5OYYBIiIiL8cwQERE5OUYBoiIiLwcwwAREZGXYxggIiLycgwDREREXo5hgIiIyMsxDBAREXk5hgEiIiIvxzBARETk5RgGiIiIvBzDABERkZdjGCAiIvJyDANERERejmGAiIjIyzEMEBEReTmGASIiIi/HMEBEROTlGAaIiIi8HMMAERGRl2MYICIi8nIMA0RERF6OYYCIiMjLMQwQERF5uf8Hywao1f4RDfoAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# visualize solution\n", - "colorlist = tracker['optimal_bitstring']\n", - "colorlist[colorlist == -1] = 0\n", - "\n", - "# plot_colored_graph(J, N, colorlist, pos)\n", - "plot_colored_graph_simple(G, colorlist, pos)\n", - "print('Minimal energy found with QAOA:', tracker['optimal_energy'])" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Classical solution: {'s0': -1, 's1': 1, 's2': -1, 's3': -1, 's4': 1, 's5': -1, 's6': 1, 's7': 1, 's8': -1, 's9': -1}\n", - "Minimal energy found classically: -6.486032631497276\n" - ] - }, - { - "data": { - "image/png": "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GdtxiIiI3JBbT4UFf3+EPPvMmI8T/KuNDAJEROS13HplABjcsOjyTx+CoawMkBx71HBYSiXUCQmI2P8X6z0HRERE3sbtwwAwuCNhx/fvhdTW5rxAoFRCCA5GxP6/QDVrlnPOSURE5IHc+jLBNcrISEz58/tQRkWNar+Cv59QCSEkBFP27mEQICIir+cRYQAAVDNnImL/X+CryRl8YRTbCvukLEbE/+2HOi7OSdURERF5Lo+4THA9WZbRv+d9dD/7HOSensH9BIZ7/FChAGQZioAABD/5awSu/kc+RkhERHSVx4WBa+SBAQzs/wi9b70N06lTgy8Kwt83G7JYrCFBNX8+gtashv/990EIDHRRxURERO7JY8PA9Sw6HUx1dTD97TQsOt3gKkBgINQJCfBZkAQhNNTVJRIREbmtCREGiIiIaOR44ZyIiMjLMQwQERF5OYYBIiIiL8cwQERE5OUYBoiIiLwcwwAREZGXYxggIiLycgwDREREXo5hgIiIyMsxDBAREXk5hgEiIiIvxzBARETk5RgGiIiIvBzDABERkZdjGCAiIvJyDANERERejmGAiIjIyzEMEBEReTmGASIiIi/HMEBEROTlGAaIiIi8HMMAERGRl2MYICIi8nIMA0RERF6OYYCIiMjLMQwQERF5uf8Hywao1f4RDfoAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# validate quantum results with classical algorithm\n", - "solution, energy_min, colors_classical = solve_classical_ising(J, n_qubits, pos)\n", - "# plot classical solution\n", - "plot_colored_graph_simple(G, colors_classical, pos)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that QAOA may arrive at a different solution than our classical benchmark code. \n", - "First of all, the classical optimization routine may get stuck in a local rather than global optimum. \n", - "To avoid this, more sophisticated optimization strategies may be employed (as proposed for example in Ref.[4]), going beyond the scope of this introductory notebook tutorial. \n", - "Secondly, even if QAOA arrives at the same classical energy as our classical approach, the coloring may differ since the solution space may be degenerate for the specific example shown here (this means, two different classical bitstrings have the same energy).\n", - "At minimum, you may find an inverted coloring (by swapping red and blue colors), because of the underlying $\\mathbb{Z}_{2}$ symmetry. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SUMMARY" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this notebook we have gone through an end-to-end demo on QAOA and its implementation on Amazon Braket. \n", - "We have built modular core building blocks that may easily adapted to other problems. \n", - "The QAOA routine is tailored towards solving combinatorial optimization problems such as _Maximum Cut_ [4] and arguably one of the most prominent examples of the emerging class of hybrid, variational algorithms and still very much a field of active research today. \n", - "For example, as we increase the circuit depth of QAOA, the classical optimization step becomes increasingly difficult (because of the curse of dimensionality as well known in classical machine learning) and may easily get stuck in local sub-optimal solutions. \n", - "To address this issue some heuristics have already been developed, for example in Ref.[4], but further improvements will arguably be necessary to fully unlock the potential of this approach. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "## REFERENCES" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[1] E. Farhi, J. Goldstone, and S. Gutmann, \"A Quantum Approximate Optimization Algorithm\", arXiv: 1411.4028 (2014).\n", - "\n", - "[2] Y. Cao, J. Romero, J. P. Olson, M. Degroote, P. D. Johnson, M. Kieferova, I. D. Kivlichan, T. Menke, B. Peropadre, N. P. Sawaya, et al., \"Quantum Chemistry in the Age of Quantum Computing\", Chemical reviews 119, 10856 (2019).\n", - "\n", - "[3] A. Smith, M. Kim, F. Pollmann, and J. Knolle, \"Simulating quantum many-body dynamics on a current digital quantum computer\", npj Quantum Information 5, 1 (2019).\n", - "\n", - "[4] L. Zhou, S.-T. Wang, S. Choi, H. Pichler, and M. D. Lukin, \"Quantum Approximate Optimization Algorithm: Performance, Mechanism,and Implementation on Near-Term Devices\", arXiv: 1812.01041 (2018). \n", - "\n", - "[5] F. Glover, G. Kochenberger, \"A Tutorial on Formulating and Using QUBO Models\", arXiv:1811.11538 (2018).\n", - "\n", - "[6] P. Vikstal, M. Groenkvist, M. Svensson, M. Andersson, G. Johansson, and G. Ferrini, \"Applying the Quantum Approximate Optimization Algorithm to the Tail Assignment Problem\", arXiv:1912.10499 (2019). \n", - "\n", - "[7] L. Li, M. Fan, M. Coram, P. Riley, and S. Leichenauer, \"Quantum optimization with a novel gibbs objective function and ansatz architecture search\", arXiv:1909.07621 (2019). " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "## APPENDIX" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### APPENDIX: Example for Ising Matrix Syntax" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this appendix we provide a small code example to showcase how we obtain all edges with corresponding weights. " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Ising matrix:\n", - " [[0 1 0]\n", - " [0 0 3]\n", - " [0 0 0]]\n", - "Edges: [(0, 1), (1, 2)]\n", - "Interaction strength: 1\n", - "Interaction strength: 3\n", - "All interactions: [1 3]\n" - ] - } - ], - "source": [ - "# example Ising matrix with edges between qubit 0 and qubit 1 (weight=1) and qubit 1 and qubit 2 (weight=3)\n", - "ising = np.array([[0, 1, 0], [0, 0, 3], [0, 0, 0]])\n", - "print('Ising matrix:\\n', ising)\n", - "\n", - "# get all non-zero entries (edges) from Ising matrix \n", - "idx = ising.nonzero()\n", - "edges = list(zip(idx[0], idx[1]))\n", - "print('Edges:', edges)\n", - "\n", - "# for every edge print interaction strength\n", - "for qubit_pair in edges:\n", - " # get interaction strength\n", - " int_strength = ising[qubit_pair[0], qubit_pair[1]]\n", - " print('Interaction strength:', int_strength)\n", - "\n", - "# get all non-zero entries from Ising, with proper order\n", - "interactions = np.array([ising[q[0], q[1]] for q in edges])\n", - "print('All interactions:', interactions)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Task Summary\n", - "{}\n", - "Estimated cost to run this example with SV1: 0 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(t.quantum_tasks_statistics())\n", - "print(f\"Estimated cost to run this example with SV1: {t.qpu_tasks_cost() + t.simulator_tasks_cost()} USD\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.9" - }, - "vscode": { - "interpreter": { - "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" - } - } + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", + "from braket.tracking import Tracker\n", + "\n", + "t = Tracker().start()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# QUANTUM APPROXIMATE OPTIMIZATION ALGORITHM (QAOA)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this tutorial we show how to (approximately) solve binary combinatorial optimization problems, using the __Quantum Approximate Optimization Algorithm (QAOA)__, as introduced in Ref.[1]. \n", + "The QAOA algorithm belongs to the class of __hybrid quantum algorithms__ (leveraging both classical as well as quantum compute), that are widely believed to be the working horse for the current __NISQ (noisy intermediate-scale quantum) era__.\n", + "In this NISQ era QAOA is also an emerging approach for benchmarking quantum devices and is a prime candidate for demonstrating a practical quantum speed-up on near-term NISQ device [1,4]. \n", + "To validate our approach we benchmark our results with exact results as obtained from classical QUBO solvers. \n", + "\n", + "We provide a step-by-step walkthrough explaining the QAOA quantum algorithm and show how to build the corresponding parametrized quantum circuit ansatz using the ```Braket``` SDK, with simple modular building blocks (that can be re-used for other purposes). \n", + "We use open-source off-the-shelf ```scipy``` optimizers for classical numerical optimization. \n", + "While we demonstrate our proof-of-concept approach using classical simulators for circuit execution, our code could in principle be run on actual quantum hardware by simply changing the definition of the ```device``` object (provided that the gate set used in the ansatz is supported by the device, as is the case here for IonQ; for Rigetti we need to apply one more extra trick as shown below). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BACKGROUND: HYBRID QUANTUM ALGORITHMS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Quantum computers hold the promise to outperform even the most-powerful classical computers on a range of computational problems in (for example) optimization, chemistry, material science and cryptography.\n", + "The canonical set of quantum algorithms (such as Shor's or Grover's quantum algorithms), however, comes with hardware requirements (such as a large number of quantum gates) that are currently not available with state-of-the-art technology. \n", + "Specifically, these algorithms are typically believed to be feasible only with fault-tolerance as provided by quantum error correction. \n", + "In the current __noisy intermediate-scale (NISQ) era__, near-term quantum computers do not have a large enough number of physical qubits for the implementation of error correction protocols, making this canonical set of quantum algorithms unsuitable for near-term devices. Against this background, the near-term focus has widely shifted to the class of __hybrid quantum algorithms__ that do not require quantum error correction. \n", + "In these hybrid quantum algorithms, the noisy __near-term quantum computers are used as co-processors__ only, within a larger classical optimization loop, as sketched in the schematic figure below. \n", + "Here, the undesired effects of noise are suppressed by deliberately limiting the quantum circuits on the quantum processing unit (QPU) to short bursts of the calculation, and the need for long coherence times (as required for the standard set of quantum algorithms) is traded for a classical overhead due to (possibly many) measurement repetitions and (essentially error-free) classical processing. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__Variational Quantum Algorithms__: Specifically, variational quantum algorithms such as the Quantum Approximate Optimization Algorithm (QAOA) [1] belong to this emerging class of hybrid quantum algorithms. \n", + "These are widely believed to be promising candidates for the demonstration of a __quantum advantage__, already with near-term (NISQ) devices in areas such as quantum chemistry [2], condensed matter simulations [3], and discrete optimization tasks [4].\n", + "\n", + "__Variational Quantum Computing vs. Deep Learning__: The working principle of variational quantum computing is very much reminiscent of training deep neural networks: \n", + "when you train a neural network, you have an objective function that you want to minimize, typically characterized by the error on your training set. \n", + "To minimize that error, typically you start out with an initial guess for the weights in your network. \n", + "The coprocessor, in that case a GPU, takes these weights which define the exact operation to execute and the output of the neural network is computed. \n", + "This output is then used to calculate the value of your objective function, which in turn is used by the CPU to make an educated guess to update the weights and the cycle continues. \n", + "Variational quantum algorithms, a specific form of hybrid algorithms, work in the very same way, using parametrized quantum circuits rather than parametrized neural networks and replacing the GPU with a QPU. \n", + "Here, you start with an initial guess for the parameters that define your circuit, have the QPU execute that circuit, perform measurements to calculate an objective function, pass this value (together with the current values of the parameters) back to the CPU and have this *classical* CPU update the parameters based on that information. \n", + "\n", + "Of course, coordinating that workflow for quantum computers is much more challenging than in the previous case. Quantum computers are located in specialized laboratory facilities, are typically single threaded, and have special latency requirements. \n", + "This is exactly the undifferentiated heavy-lifting that Amazon Braket handles for us, such that we can focus on our scientific problem. \n", + "For the sake of this introductory tutorial, we simply use a classical circuit simulator (that mimic the behavior of a quantum machine) as the device to execute our quantum circuits.\n", + "Within Amazon Braket, the workflow, however, is exactly the same. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BACKGROUND: QUADRATIC BINARY OPTIMIZATION PROBLEMS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "__Combinatorial optimization__: \n", + "Combinatorial optimization problems are ubiquitous across many areas of science and application areas. \n", + "Applications can be found (for example) in logistics, scheduling, planning, and portfolio optimization.\n", + "In a nutshell combinatorial optimization problems are problems involving a large number of yes/no decisions with each set of decisions yielding a corresponding objective function value, like a cost or profit value. \n", + "Because of the combinatorial explosion of the solution space with the number of variables, finding good solutions is a daunting task and extremely difficult. \n", + "\n", + "__QUBO problems__: The QUBO ([Quadratic Unconstrained Binary Optimization](https://en.wikipedia.org/wiki/Quadratic_unconstrained_binary_optimization)) model unifies a rich variety of NP-hard combinatorial optimization problems: \n", + "Famous examples include Quadratic Assignment Problems, Capital Budgeting Problems, Task Allocation Problems and Maximum-Cut Problems. \n", + "For more details we refer to the excellent review and tutorial on QUBO problems presented in Ref.[5].\n", + "\n", + "__Maximum Cut__: Among the class of QUBO problems, Maximum Cut (MaxCut) is paradigm combinatorial optimization problem. \n", + "Given a graph $G=(V,E)$ with vertex set $V$ and edge set $E$, we seek partition of $V$ into two subsets with maximum cut. \n", + "In short, we have to color every node either blue or red and we score a point whenever an edge connects two nodes with different colors. \n", + "We then would like to find the solution with the highest score. \n", + "Applications thereof can be found in, for example, (i) clustering for marketing purposes (segment your customer base into different clusters for targeted marketing) or (ii) portfolio optimization in finance (vertex corresponds to asset, with color referring to sell or buy decisions. \n", + "Again, the problem in this specific graph coloring problem is that there are $2^𝑁$ possible solutions for $N$ nodes (an exponential explosion in possibilities), making it impossible to enumerate all possible candidates for relevant system sizes. \n", + "\n", + "__Ising Hamiltonian__: Importantly, there is a fundamental correspondence between QUBO problems and Ising problems in physics. \n", + "Specifically, we can encode the Maximum Cut problem as a __minimization problem__ of an Ising Hamiltonian, where the (classical) cost function reads \n", + "\n", + "$$H_{C}=\\sum_{i>j} J_{i,j} z_{i} z_{j},$$\n", + "\n", + "with Ising variables $z_{i}=-1,1$ and the Ising matrix $J$ encoding the weights of the edges. \n", + "For the sake of this discussion, we ignore potential linear terms and constant offsets (that do not affect the optimal solution $z$ anyway). \n", + "In short, the cost Hamiltonian $H_{C}$ assigns a number to every bitstring $z=(z_{1},z_{2},\\dots)$, and we would like to find the lowest number possible. \n", + "This will be the optimal assignment and solution to our problem. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BACKGROUND: THE QUANTUM APPROXIMATE OPTIMIZATION ALGORITHM" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this tutorial we will try to solve for the optimal _classical_ bitstring $z$ using the Quantum Approximate Optimization Algorithm (QAOA). \n", + "To this end, we first promote the classical spin variables $z_{i}=-1,1$ to quantum-mechanical variables $\\sigma_{i}^{z}$ (with the Pauli matrix $\\sigma_{i}^{z}$ representing the observable corresponding to spin along the $z$ coordinate axis in three-dimensional Euclidean space $\\mathbb{R}^{3}$). \n", + "This leads to the following quantum mechanical cost Hamiltonian encoding the optimization problem\n", + "\n", + "$$\\hat{H}_{C}=\\sum_{i>j} J_{i,j} \\sigma_{i}^{z} \\sigma_{j}^{z},$$\n", + "\n", + "which can be written as a matrix of size $(2^{N}, 2^{N})$ with diagonal elements only corresponding to all possible classical values for the cost function $H_{C}$. \n", + "The ground state of $\\hat{H}_{C}$ corresponds to the optimal solution of the classical combinatorial problem.\n", + "\n", + "__QAOA ansatz__: Finding this ground state is generically hard. \n", + "To approximate this groundstate, QAOA prepares a parametrized ansatz state (corresponding to a parameterized gate sequence), whose parameters are iteratively updated by a classical optimizer in a closed loop. \n", + "Specifically, QAOA involves a specific ansatz wavefunction parametrized by a parameter family $(\\vec{\\beta}, \\vec{\\gamma})$, embedded into a larger classical optimization loop to find the optimal values for these parameters. \n", + "As shown in Ref.[1], good approximate solutions to the problem class considered here can be found by preparing the variational state \n", + "\n", + "$$|\\gamma, \\beta \\rangle = U_{x}(\\beta_{p})U_{zz}(\\gamma_{p}) \\cdots U_{x}(\\beta_{1})U_{zz}(\\gamma_{1}) |s\\rangle$$\n", + "\n", + "with single qubit rotations induced by $U_{x}(\\beta) = \\exp(-i\\beta \\sum_{i}\\sigma_{i}^{x})$, \n", + "and interactions described by $U_{zz}(\\gamma) = \\exp(-i\\gamma H_{C})$,\n", + "starting initially from a product of $\\sigma^{x}$ eigenstates, i.e.,\n", + "$|s\\rangle =|-,-,\\dots\\rangle$, with $|-\\rangle = (|0\\rangle -|1\\rangle )/\\sqrt{2}$. \n", + "The family of states $|\\gamma, \\beta \\rangle$ is prepared by alternating single-qubit operations $U_{x}(\\beta_{p})$ with targeted spin-spin interactions generated by the cost Hamiltonian $H_{C}$. \n", + "The depth $p$ can be interpreted as a hyperparameter. \n", + "For $p$ layers of QAOA blocks, there are $2p$ classical parameters to optimize over, \n", + "since each layer $k$ is characterized by just two variational parameters, $\\gamma_{k}$ and $\\beta_{k}$. \n", + "The preparation step outlined above is followed by a measurement in the computational basis, giving a classical string $z$, with which one can evaluate the objective function $H_{C}$ of the underlying combinatorial problem at hand. \n", + "Taking several measurements shots one can build the expectation value $E(\\beta, \\gamma) = \\langle H_{C} \\rangle$ that we report as the objective function to the classical minimizer (while other choices could be possible as well). \n", + "Repeating this procedure will provide an optimized string $z$, with the quality of the result improving as the depth of the quantum circuit $\\sim 2p$ is increased [1]. \n", + "In fact, in principle (in the absence of noise and other imperfections), QAOA can reach the global optimum of any cost function in the limit $p \\rightarrow \\infty$ [1], approaching the adiabatic protocol. \n", + "Thus, in theory the computational power of QAOA increases with $p$, but in practice the number of layers that can be executed without errors on NISQ devices is limited due noise and imperfections. \n", + "\n", + "__Optimization__: Since we are primarily interested in solving the classical optimization problem, within this routine it is sufficient to keep track of the best classical bitstring. \n", + "This means that the wavefunction prepared by the quantum circuit $|\\gamma, \\beta \\rangle$ has to have some overlap with the optimal solution $|z^{*} \\rangle$ that we can read out as bitstring $z^{*}$ in the measurement shots. \n", + "To this end, in principle (i.e., without any training), we could just sample from a completely uniform state that is prepared in a superposition of all computational basis states, as prepared by applying Hadamard gates to all qubits: $|\\mathrm{uniform}\\rangle = 1/\\sqrt{2^{N}}\\sum_{i}|z_{i}\\rangle$. \n", + "In that case (assuming a single optimal solution) the success probability per shot amounts to $p_{\\mathrm{success}}=1/2^{N}$. \n", + "We can then amplify our success chances by just taking many measurement shots. \n", + "For large systems, however, this approach is not scalable as we would need to take an exponentially increasing number of measurements. \n", + "That is why we train our circuits, update the parameters, with the goal to increase our success chances to find the optimal bitstring. \n", + "We can quantify our success chances as follows [6]. \n", + "For a given wavefunction $|\\gamma, \\beta \\rangle$ the probability to find the optimal solution in a single shot is given by \n", + "\n", + "$$ p_{\\mathrm{success}}(\\gamma, \\beta) = |\\langle z^{*}|\\gamma, \\beta \\rangle |^{2},$$\n", + "\n", + "where $z^{*}$ denotes the optimal bitstring. \n", + "If we perform $M$ repeated measurements, the overall probability $P$ for observing this solution at least once is given by \n", + "\n", + "$$ P = 1 - (1-p_{\\mathrm{success}}(\\gamma, \\beta))^{M}, $$ \n", + "\n", + "since the term $(1-p_{\\mathrm{success}}(\\gamma, \\beta))^{M}$ gives the probability of _not_ obtaining $z^{*}$ in repeated $M$ trials. \n", + "Therefore, to have an overall success chance up to $\\epsilon$ close to 100%, i.e., $P \\geq 1-\\epsilon$, the number of required shots has to be \n", + "\n", + "$$ M \\geq \\frac{\\log(\\epsilon)}{\\log(1-p_{\\mathrm{success}}(\\gamma, \\beta))}.$$\n", + "\n", + "Let us illustrate this results as follows: \n", + "If we do not know anything and just resort to a uniform superposition $|\\mathrm{uniform}\\rangle$, for a small system with $N=10$ qubits we can find the optimal solutions with 80% success probability by taking at least $\\sim 1650$ shots. \n", + "For just $N=20$ qubits, however, this number amounts to $\\sim 1.7 \\times 10^{6}$, making this naive approach unfeasible. \n", + "Conversely, if we can train the quantum circuit to obtain $p_{\\mathrm{success}}(\\gamma, \\beta) \\sim 0.1$, we only need $\\sim 15$ shots to have $P\\geq 80\\%$. \n", + "Below we will track and illustrate the best classical optimum as our algorithm proceeds towards a local or (ideally) global optimum. \n", + "\n", + "__Objective function__: Finally, some more details on the definition of the cost function are in order. \n", + "Following the standard approach [1, 4], QAOA tries to minimize the expectation value $\\langle \\hat{H}_{C} \\rangle$, but does _not_ explicitly maximize the success probability [6]. \n", + "However, a low expectation value for $\\langle \\hat{H}_{C} \\rangle$ does not necessarily translate to a high success probability $p_{\\mathrm{success}}(\\gamma, \\beta)$, as can be understood from the following example:\n", + "Consider (for example) a variational state that is a linear combination of low energy excited eigenstates of the cost Hamiltonian $\\hat{H}_{C}$ other than the ground state $|z^{*}\\rangle$. \n", + "By definition, this state will have a relatively low expectation value $\\langle \\hat{H}_{C} \\rangle$ while the success probability is zero (as this low energy state does not have any overlap with the ground state). \n", + "Similarly, a variational state that is a linear combination of the ground state with very high energy eigenstates could have a high success probability $p_{\\mathrm{success}}(\\gamma, \\beta)$, while (at the same time) reporting a high cost value to the classical optimizer.\n", + "To address this issue, alternative methods for the optimization of the variational parameters have recently been proposed. \n", + "While for simplicity we follow the majority of the literature and take $\\langle \\hat{H}_{C} \\rangle$ as cost value that we report to the classical optimizer, here we do mention a potential alternative for future research: \n", + "One approach is to use the Gibbs objective function, defined as $\\mathrm{cost}=-\\mathrm{log} \\langle \\exp(-\\eta \\hat{H}_{C})\\rangle$, with the hyperparameter $\\eta>0$ [7]. \n", + "As compared to the simple expectation value $\\langle \\hat{H}_{C} \\rangle$, this definition of the cost value shows stronger rewards for low energy states, thereby increasing the success probability. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## IMPORTS and SETUP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For classical benchmarking we will be using the python library ```pyqubo```, as used in our helper script ```utils_classical```. If not already present in your virtual environment, you can install this library simply with ```pip install pyqubo```. Similarly, as ```seaborn``` are not expected to be present in the virtual environment by default, we will install them via ```pip install seaborn```. Note the ```-q``` to suppress install updates from ```pip```." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If these have already been installed, this cell can be commented out.\n", + "!pip install pyqubo -q\n", + "!pip install seaborn -q" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# general imports\n", + "import pickle\n", + "import random\n", + "import time\n", + "from datetime import datetime\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import networkx as nx\n", + "import numpy as np\n", + "import seaborn as sns\n", + "\n", + "# magic line for producing visualizations in notebook\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# fix random seed for reproducibility\n", + "seed = 42\n", + "np.random.seed(seed)\n", + "random.seed(a=seed)\n", + "\n", + "# switch to trigger writing training results to disk\n", + "store_results = False\n", + "# switch to trigger printing results of each optimization cycle\n", + "verbose = False" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# AWS imports: Import Braket SDK modules\n", + "from braket.circuits import FreeParameter\n", + "from braket.devices import LocalSimulator" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from utils_classical import plot_colored_graph_simple, solve_classical_ising\n", + "\n", + "# auto reload external files, so that we can edit the external .py file and immediately see the changes here\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Set up device: Local Simulator\n", + "device = LocalSimulator()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "## example code for other backends\n", + "# from braket.aws import AwsDevice\n", + "# from braket.devices import Devices\n", + "## choose the on-demand simulator to run your circuit\n", + "# device = AwsDevice(Devices.Amazon.SV1)\n", + "## choose the Rigetti device to run your circuit\n", + "# device = AwsDevice(Devices.Rigetti.Ankaa2)\n", + "## choose the Ionq device to run your circuit\n", + "# device = AwsDevice(Devices.IonQ.Aria1)\n", + "## choose the IQM device to run your circuit\n", + "# device = AwsDevice(Devices.IQM.Garnet)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PROBLEM SETUP" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We consider a graph coloring problem.\n", + "Given a graph $G=(V,E)$, made of a set vertices (also called nodes) $V$ and edges $E$, our goal is to color each node red or blue, then score a point for each node that is next to a node of different color. \n", + "We strive to find the optimal coloring that scores the largest number of points.\n", + "To this end, we will address the dual problem of finding the minimum energy of the corresponding Ising Hamiltonian. \n", + "To get started, we first use the open-source ```networkx``` library to visualize the problem graph. \n", + "Feel free to play with the parameters $n$ (for the number of nodes) and $m$ (for the number of edges) below to consider other graphs of your choice. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAHzCAYAAACe1o1DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC4QklEQVR4nOzddViU6fs28HOGBhERBBXEIkTEQgzWFpMVRAxA7O7F7lo7cW3WWFcFDBCxO1AMxEIEwUREQQGRrrneP/Yn7/pdC5nhGZjrcxweuzoz932iMM8193OHiIgIjDHGGGOM/SSx0AEYY4wxxljpxgUlY4wxxhgrFi4oGWOMMcZYsXBByRhjjDHGioULSsYYY4wxVixcUDLGGGOMsWLhgpIxxhhjjBULF5SMMcYYY6xYuKBkjDHGGGPFwgUlY4wxxhgrFi4oGWOMMcZYsXBByRhjjDHGioULSsYYY4wxVixcUDLGGGOMsWLhgpIxxhhjjBULF5SMMcYYY6xYuKBkjDHGGGPFwgUlY4wxxhgrFi4oGWOMMcZYsXBByRhjjDHGioULSsYYY4wxVixcUDLGGGOMsWLhgpIxxhhjjBULF5SMMcYYY6xYuKBkjDHGGGPFwgUlY4wxxhgrFi4oGWOMMcZYsXBByRhjjDHGioULSsYYY4wxVixcUDLGGGOMsWLhgpIxxhhjjBULF5SMMcYYY6xYuKBkjDHGGGPFwgUlY4wxxhgrFi4oGWOMMcZYsXBByRhjjDHGioULSsYYY4wxVizKQgdgJSsjJx8vkjKQmy+BqrIYNfS0oKXG3waMMcYY+3lcSSiAmIQ07LsZi4uPExGbnAn612MiACYVNdHOwgD9mpnAzFBbqJiMMcYYK6VERETffxorjV4lZ2LW4XAEP3kPJbEIBZKv/1N/eryVqT6WOlujWkXNEkzKGGOMsdKMC8oyyi80FvODIpAvoW8Wkv9LSSyCsliEhY5WcLU1kWFCxhhjjJUVXFCWQRsvxmD1mehitzOlkznGtTOTQiLGGGOMlWW8yruM8QuNlUoxCQCrz0Rjf2isVNpijDHGWNnFBWUZ8io5E/ODIqTa5rygCLxKzpRqm4wxxhgrW7igLENmHQ5HfhHmS/6IfAlh1uFwqbbJGGOMsbKFC8oyIiYhDcFP3hdpAc6PKJAQgp+8x5PENKm2yxhjjLGygwvKMmLfzVgoiUUyaVtJLMLeGzyXkjHGGGNfxgVlGXHxcaLURyc/KZAQLkYnyqRtxhhjjJV+XFCWAek5+YiV8cKZ2KRMZOTky7QPxhhjjJVOXFCWAS+TMiDrzUQJwIukDBn3whhjjLHSiAvKMiA3X1Km+mGMMcZY6cIFZRmgqlwy/4wl1Q9jjDHGSheuEMqAGnpakM367s9Vr6hZAr0wxhhjrLThgrIM0FJThomMi7285Hg0aWiNWbNmISwsDHwEPGOMMcY+4YKyjGhnYSDTfSjtrarCzs4O27ZtQ5MmTVCrVi1MnjwZISEhkEh4biVjjDGmyETEQ01lQkxCGjp6XZFZ++c8W8PUQBt5eXm4fPkyAgICcPjwYbx9+xZVq1aFs7MzXFxc0KpVKygrK8ssB2OMMcbkDxeUZUj/HTcR8ixJuhucSwqQHfsAg2tkYN68edDQ0Ch8qKCgANevX4e/vz/8/f3x6tUr6Ovrw8nJCS4uLujQoQNUVVWll4UxxhhjcokLyjLkVXIm7NddRo4Ut/dRUxajh+pDrF8yF8bGxti6dSvs7e3/8zwiwu3btwuLyydPnkBHRwfdu3eHi4sLOnfu/FkxyhhjjLGygwvKMsYvNBYzAsKl1t6Kntboa2uC6OhojBw5EpcuXcKAAQOwZs0a6Ovrf/E1RITw8HAEBATA398fDx8+hJaWFrp16wYXFxd069YN2traUsvIGGOMMWFxQVkGbbwYg9VnoovdztROFhjbzrTw90SEXbt2YcqUKRCLxVi7di369+8Pkejbi4Gio6MLRy7DwsKgpqaGTp06wcXFBY6OjtDV1S12VsYYY4wJhwvKMsovNBbzgyKQL6EizalUEougLBZhkaMV+tqafPE5iYmJ8PT0hI+PD+zt7bF161bUrl37h9p/8eJF4chlSEgIlJWV0b59e7i4uKBHjx4wMDD44ayMMcYYkw9cUJZhr5IzMetwOIKfvIeSWPTNwvLT461M9bHU2RrVfmBfy1OnTmH06NF4+/YtFixYgEmTJkFFReWH88XHxyMwMBD+/v64dOkSAKBly5ZwcXFBz549YWxs/MNtMcYYY0w4XFAqgJiENOy7GYuL0YmITcrEv//BRQBM9DTRztwAHs1NYGpQtLmNGRkZWLBgAdauXYt69erB29sbzZo1K3LG9+/f48iRI/D398e5c+eQl5eHZs2awcXFBS4uLqhVq1aR22SMMcZYyeCCUsFk5OTjRVIG7tx7gKGDB+LqycNo2rhBsdu9c+cORowYgTt37mDcuHFYsmTJTy+8+fDhA44dOwZ/f3+cOnUK2dnZaNiwYWFxaWlpWey8jDHGGJMeLigVVExMDMzNzXHhwgW0a9dOKm3m5+djw4YNmDNnDipWrIhNmzbB0dGxWG2mp6fj1KlT8Pf3x7Fjx5Ceno46deoUFpcNGzb87qIgxhhjjMkWH72ooD5t+ZOUlCS1NpWVleHp6YlHjx7B2toaTk5O6NWrF+Lj43+6zXLlyqFXr17w9fXFu3fvEBQUhGbNmmHz5s1o3LgxTE1NMXXqVNy4cYOPgGSMMcYEwgWlgtLR0YGSkhLev38v9barV6+O48ePw8/PD8HBwbC0tMTWrVuLXfCpq6uje/fu+Ouvv5CQkIDTp0/D3t4ef//9N1q0aAETExNMmDABly5dQkFBgZS+GsYYY4x9DxeUCkosFqNixYoyKSgBQCQSoW/fvoiKikLfvn0xevRotGrVChEREVJpX0VFBZ06dcK2bdsQHx+Py5cvw8XFBYcPH0a7du1QpUoVjBgxAqdPn0ZeXp5U+mSMMcbYl3FBqcD09fWlesv7S3R1deHt7Y3Lly8jKSkJjRo1wrx585CdnS21PpSUlNC6dWusX78eL1++xI0bNzBo0CCcP38eXbp0gYGBAQYOHIigoCCp9ssYY4yxf/CiHAXWunVrVK9eHXv27CmR/nJycrBs2TIsXboUNWvWxLZt29C2bVuZ9UdEuH//fuEpPZGRkShXrtxnR0CWK1dOZv0zxhhjioILSgXm7OyM7OxsnDx5skT7ffToEUaOHImrV69iyJAhWLVqFSpWrCjzfiMjIwtP6bl79y7U1dXRuXNnuLi4oHv37qhQoYLMMzDGGGNlEReUCmz48OG4f/8+bt26VeJ9SyQSbN++HdOmTYOamhq8vLzg6upaYlsAPXv2rLC4vHHjBlRUVNChQwe4uLjAyckJlSpVKpEcjDHGWFnAcygVmJ6enswW5XyPWCzGiBEjEBkZiTZt2sDd3R3dunXDixcvSqT/WrVqYcqUKbh+/TpevXqFNWvWIDs7GyNHjkTlypXRrl07bNy4Ea9fvy6RPIwxxlhpxgWlAiuJRTnfU6VKFRw4cABBQUGIiIiAlZUV1qxZg/z8/BLLYGxsjPHjx+PixYt48+YNtm7dCjU1NXh6esLY2Bh2dnZYs2YNnj9/XmKZGGOMsdKEb3krsL/++guDBw9GTk4OVFVVhY6DtLQ0zJ07F3/88QcaNmyIP//8EzY2NoLlSUlJwdGjR+Hv74/Tp08jJycHjRs3Rs+ePeHi4oI6deoIlo0xxhiTJzxCqcD09PQASPe0nOLQ1taGl5cXbt68CYlEgqZNm2Ly5MlIT08XJI+uri4GDBiAI0eO4P3799i/fz9MTU2xbNkyWFpawsrKCvPmzcP9+/fBn8sYY4wpMh6hVGDXr1+HnZ0dwsPDUa9ePaHjfCYvLw9eXl6YP38+DAwMsHnzZnTr1k3oWACArKwsnDlzBv7+/ggKCkJqaipq165deL64ra0tny/OGGNMofAIpQL7dJ63UAtzvkVFRQVTp07Fw4cPYW5uDgcHB7i5uSEhIUHoaNDQ0ICTkxP+/vtvJCYm4uTJk2jXrh127tyJZs2awcTEBBMnTsSVK1f4CEjGGGMKgUcoFVhycjL09PRw6NAhuLi4CB3nq4gIPj4++O2335Cfn4/Vq1djyJAhcjcKmJ+fj6tXr8Lf3x8BAQGIj4+HoaEhevToARcXF7Rt2xYqKipCx2SMMcakjkcoFViFChUgFovlcoTy30QiEfr164eoqCj06NEDw4YNQ7t27fD48WOho31GWVkZbdu2xYYNG/Dq1SuEhITAw8MDp0+fRqdOnWBoaIjBgwfj2LFjfAQkY4yxMoULSgUmFotRsWJFuS8oP9HT08OuXbtw7tw5vH79GvXr18eiRYuQk5MjdLT/EIvFaNGiBVavXo1nz54hLCwMo0ePxvXr19G9e3cYGBjAzc0Nhw4dQkZGhtBxGWOMsWLhW94KztLSEl27dsXatWuFjlIkWVlZWLx4MVauXAkzMzN4e3ujZcuWQsf6IY8ePSo8X/z+/fvQ0NBAly5d4OLigl9//RU6OjpCR2SMMcaKhEcoFZy+vn6pGaH8Nw0NDSxZsgR37tyBjo4OWrVqhVGjRuHDhw9CR/uuunXrYu7cubh37x5iYmKwYMECvH79Gh4eHqhUqRK6deuGHTt2lMp/F8YYY4qJRygVXI8ePZCXl4fjx48LHeWnFRQUYOvWrZg5cya0tLSwYcMGuLi4yN2ine959eoVAgICEBAQgODgYIjFYrRp0wYuLi5wdnZGlSpVhI7IGGOMfRGPUCq40jpC+W9KSkoYO3YsHj16hObNm6N3795wcnLCq1evhI5WJNWqVcPEiRNx+fJlvHnzBps2bYKSkhImTJgAIyMjtGzZEuvWrcPLly+FjsoYY4x9hgtKBaenp1fqC8pPjI2NcfjwYQQEBCAsLAx169bFH3/8USr3gjQ0NMTIkSNx5swZJCYmYufOndDV1cWMGTNQo0YNNGnSBMuWLUN0dLTQURljjDEuKBWdvr6+3By9KC3Ozs549OgRBgwYgN9++w0tWrTA/fv3hY710ypWrIhBgwbh6NGjePfuHXx9fVGzZk0sXrwYFhYWsLa2xoIFCxAeHs5HQDLGGBMEF5QKTl9fH6mpqcjLyxM6ilTp6Ohg06ZNuHbtGjIzM2FjY4MZM2YgMzNT6GjFUr58ebi6uuLgwYN49+4dAgIC0KBBA6xbtw7169eHhYUFZsyYgdDQUC4uGWOMlRhelKPggoKC4OTkhLdv38LQ0FDoODKRm5uL1atXY9GiRahatSq2bt2KTp06CR1LqnJycnD+/Hn4+/vjyJEjSEpKgomJCXr27AkXFxfY2dlBLObPj4wxxmSDrzAKTp7P85YWVVVVzJo1C+Hh4ahRowY6d+6M/v374927d0JHkxo1NbXC7Ybevn2L8+fP49dff4Wfnx9atWoFIyMjjBkzBufPn0d+fr7QcRljjJUxPEKp4KKjo2FhYYFLly6hTZs2QseROSLC7t27MXnyZIhEIqxZswYDBgwodVsM/SiJRILr168XbqQeGxuLihUrwsnJCS4uLrC3t4eamprQMRljjJVyXFAquKSkJOjr68Pf3x89e/YUOk6JSUxMxKRJk7Bv3z60b98e27Ztg6mpqdCxZIqIEBYWVlhcxsTEoHz58vj111/h4uKCLl26QFNTU+iYjDHGSiG+5a3gKlSoALFYXKZveX+JgYEB9u7di1OnTuH58+ewtrbGsmXLytzipH8TiUSF2w09fvwY4eHhmDRpEsLDw+Hi4oJKlSqhV69e8PX1xcePH4WOyxhjrBThglLBKSkpQVdXV+EKyk86d+6M8PBwjB8/HnPnzoWNjQ1u3LghdCyZE4lEqFevHubPn48HDx7g8ePHmDt3Ll6+fAl3d3dUqlQJv/76K3bt2lXmtpVijDEmfVxQsjK5F2VRaGlpYeXKlQgNDYWqqirs7Owwfvx4hRqlMzc3L9xu6MWLF1i+fDlSU1MxdOhQGBoaomPHjti6dSvevn0rdFTGGGNyiOdQMrRs2RK1a9fG7t27hY4iuIKCAmzcuBGzZ89GhQoVsHHjRvTo0UPoWIJ58+YNAgMD4e/vj0uXLkEikaBly5bo2bMnevbsCRMTE6EjMsYYkwNcUDI4OTmhoKAAx44dEzqK3IiNjcWYMWNw/PhxODs7Y8OGDTAyMhI6lqDev3+PoKAg+Pv74+zZs8jLy4OtrS1cXFzg4uIiF4uaMnLy8SIpA7n5Eqgqi1FDTwtaaspCx2KMsTKPC0qGoUOHIiIiQiHmDhYFEeHQoUMYP348srKysGzZMowaNYo3CAeQmpqKY8eOISAgACdPnkRWVhbq169fWFzWrVu3xLZiiklIw76bsbj4OBGxyZn49xuaCIBJRU20szBAv2YmMDPULpFMjDGmaLigZJg2bRoCAgLw5MkToaPIpZSUFMyYMQPe3t5o0aIFvL29Ua9ePaFjyY2MjAycOnUK/v7+OHbsGNLS0mBhYVF4Sk/jxo1lUly+Ss7ErMPhCH7yHkpiEQokX38r+/R4K1N9LHW2RrWKvD0SY4xJEw+1MIVflPM9urq62LZtG65cuYKUlBQ0atQIc+bMQXZ2ttDR5IKWlhZcXFzg4+ODxMREHD16FC1atMDWrVvRpEkT1KpVC5MnT0ZISAgkEolU+vQLjYX9ussIefbP9+23isl/Px7yLAn26y7DLzRWKjkYY4z9g0coGXbu3ImhQ4ciLy8Pyso83+xbcnJysHz5cixduhTVq1fHtm3b0K5dO6FjyaW8vDxcunQJAQEBOHz4MBISElClShU4OzvDxcUFrVu3/qnvt40XY7D6THSx803pZI5x7cyK3Q5jjDEeoWQA9PT0AADJyckCJ5F/ampqmD9/Pu7du4fKlSujffv2GDJkCI/wfoGKigo6duyILVu24PXr17hy5Qr69OmDo0ePokOHDqhSpQqGDRuGkydPIjc394fa9AuNlUoxCQCrz0RjP49UMsaYVPAIJcO1a9fQsmVLREREoG7dukLHKTUkEgl27NiBqVOnQlVVFV5eXnBzcyuz54JLCxEhNDS08AjIp0+fQkdHB927d4eLiws6d+4MDQ2N/7zuVXIm7NddRk6+dG6bA4CashjnPNvwnErGGCsmHqFk0NfXBwCFPS3nZ4nFYgwfPhxRUVFo3749+vXrh65du+L58+dCR5NrIpEITZs2xYoVKxATE4N79+5h4sSJuHv3LpydnaGvr4/evXvDz88PaWlpha+bdTgc+d+ZK1lU+RLCrMPhUm2TMcYUEY9QMrx//x6VKlVCQEAAnJ2dhY5Tah0/fhxjxozBu3fvsGjRIvz22288J7WIHj9+XDhyeefOHaipqaFTp05o9WsfbHquK7N+z3m2hqkBbynEGGM/i0coGXR1dSESiXiEspgcHBwQERGBUaNGYfr06bC1tcXt27eFjlWqWFhYYNasWQgLC8OzZ8+wdOlSJCUlYdnBYJCkQCZ9KolF2HuD51IyxlhxcEHJoKSkBF1dXV5YIgXlypXD2rVrcfPmTQBAs2bN4OnpifT0dIGTlT41a9bEpEmTcO3aNVh26AWRWEkm/RRICBejE2XSNmOMKQouKBmAf+ZR8gil9DRp0gShoaFYsWIFtm3bBisrKxw/flzoWKVSek4+4lN/bBX4z4pNykRGTr5M+2CMsbKMC0oGgAtKWVBWVsaUKVMQEREBS0tL/Prrr+jbty/evn0rdLRS5WVSBmQ90ZsAvEjKkHEvjDFWdnFByQD8sxcl3/KWjZo1a+LkyZPYt28fLl68CEtLS/z5559SOzWmrMuV4jZB8tAPY4yVRVxQMgA8QilrIpEI7u7uiIyMhLOzM0aMGIG2bdsiKipK6GhyT1W5ZN6mSqofxhgri/gdlAH4Z4SSC0rZ09PTw86dO3HhwgW8efMGDRo0wMKFC5GTkyN0NLlVQ08Lst4qXvR//TDGGPs5XFAyAP+MUPIt75LTrl07PHjwAFOnTsXixYvRsGFDBAcHCx1LLmmpKcNExifZVNIUQUOF3w4ZY+xn8TsoA/BPQZmSkoL8fF7pWlI0NDSwePFi3L17F7q6umjdujVGjBiBlJQUoaPJnXYWBhDLaphSUoAnV47AxMQEU6ZMwZ07d8DnPTDGWNFwQckA/HMrFgAXMwKoV68erl69is2bN8PPzw+WlpY4cOAAFzX/Jy4uDo+CtkHKpy7+f2Il/DmtP5ydnfH333/DxsYGlpaWWLRoEWJiYmTUKWOMlS1cUDIAfJ630MRiMUaPHo3IyEj88ssv6Nu3LxwdHREbq7gnuHz8+BFz5syBubk5Lh7xRXW1LChJeZhSSSxCK1N9uHRsiQ0bNiA+Ph6nT59G8+bNsXr1apibm6Np06ZYt24d4uPjpdo3Y4yVJVxQMgBcUMoLIyMj+Pv74/Dhw7h79y7q1q0LLy8vFBTI5thBeZSXl4fNmzfD1NQUa9asgaenJ54+fYq9E7pBWcoFpbJYhKXO1v//98rK6NSpE/766y8kJCTg4MGDMDY2xowZM2BsbIwOHTpgx44d+PDhg1RzMMZYaccFJQPw/29588Ic+dCjRw88evQIgwcPxqRJk9C8eXPcvXtX6FgyRUQIDAxEvXr1MG7cODg4OCAmJgZLlixB+fLlUa2iJhY6Wkm1z0WOVqj2lQU/Ghoa6NWrFwICApCQkIDt27dDJBJh+PDhMDQ0hLOzMw4ePIisrCypZmKMsdKIC0oGANDV1YVIJOIRSjlSvnx5bNiwASEhIcjOzoatrS2mTZuGzMxMoaNJ3c2bN9GmTRs4OzujevXquHv3Lnbt2gVjY+PPntfD2gBaTy9Ipc+pnSzQ19bkh55boUIFDBkyBOfOnUNcXBxWrFiB169fo0+fPjA0NMTAgQNx+vRpXtTGGFNYXFAyAP/c6qtQoQKPUMqh5s2b486dO/j999/xxx9/oF69ejh9+rTQsaTi2bNncHV1RfPmzfHhwwecOnUKZ86cQYMGDf7zXCLC6NGj8ezoZoy2KQ81ZXGR51QqiUVQUxZjRU9rjG1n+lOZq1atit9++w23bt1CdHQ0pkyZgps3b6JLly4wMjLC+PHjcf36dV5UxRhTKFxQskJ8Wo78UlFRwcyZMxEeHo6aNWuiS5cu8PDwQGJiotDRfkpycjImTZqEOnXqIDg4GDt37sTdu3fRuXPnr75m06ZN+Ouvv+Dt7Y3pvVrhnGcb2NX6Z6rG9wrLT4/b1dLDOc82Pzwy+T1mZmaYN28eIiMjERYWhv79++Pw4cOws7NDrVq1MHv2bEREREilL8YYk2ci4o/R7P/Y2dnBwsICu3btEjoK+wYiwt9//41JkyYBANasWYOBAwdCJJL1eTLFl52djY0bN2LJkiXIz8/HjBkz4OnpCU3Nb29cfunSJdjb22PChAlYu3btZ4/FJKRh381YXIxORGxSJv79hiYCYKKniXbmBvBobgJTA23pf1H/QyKR4MqVK/Dx8cGhQ4eQkpKC+vXrw93dHa6urqhevbrMMzDGWEnjgpIV6t69O0QiEYKCgoSOwn7Au3fvMGnSJOzduxft2rXDtm3bYGZmJnSsL5JIJNi/fz9mzZqFV69eYcSIEZg/fz4MDQ2/+9rY2FjY2Nigfv36OH36NJSVlb/63IycfLxIykBuvgSqymLU0NOCltrXny9rOTk5OH36NHx9fXHkyBFkZWWhZcuWcHNzQ+/evVGpUiXBsjHGmDTxLW9WiG95ly6VKlXCnj17cObMGbx8+RLW1tZYsmQJcnNzhY72mcuXL6NZs2Zwd3dHgwYN8PDhQ2zevPmHismsrCw4OztDS0sL+/fv/2YxCfxzTKNVVR00MtGFVVUdQYtJAFBTU4OjoyN8fX2RmJiIvXv3onz58pgwYQKqVKmCbt26Ye/evUhLSxM0J2OMFRcXlKyQnp4eL8ophTp27Ijw8HD89ttvmD9/Pho3bozr168LHQuRkZFwdHRE27ZtIRKJcPnyZQQGBqJOnTo/9HoiwogRIxAZGYnAwMDCvVJLq3LlyqFfv344fvw43rx5gw0bNiAtLQ39+/eHoaEhXF1dERQUJHcfCBhj7EdwQckK8Qhl6aWpqYnly5fj9u3b0NTUxC+//IKxY8ciNTW1xLMkJCRg9OjRsLa2Rnh4OHx9fXHjxg20bt26SO14eXlh79692LlzJxo2bCibsAKpVKkSRo8ejeDgYLx48QLz589HZGQknJycULlyZYwYMQKXLl2CRCIROipjjP0QnkPJCm3fvh0jRoxAXl4elJSUhI7DflJBQQE2bdqEWbNmQUdHBxs3boSzs7PM+83IyMDatWuxcuVKqKioYM6cORg7dizU1NSK3Nb58+fRuXNnTJo0CStXrpRBWvn08OFD+Pr6wsfHBy9evICRkRFcXV3h7u6ORo0alYqFV4wxxcQFJSt0+PBh9OzZE+/evSv1txfZP4tZxo4di2PHjqFHjx7YsGHDfzYKl4aCggL89ddfmDt3LpKSkjB+/HjMnj0burq6P9Xe8+fPYWtrCxsbG5w4cUIhP9wQEW7cuAEfHx/s378f7969g4WFBdzd3eHm5ia3i68YY4qLb3mzQnyed9liYmKCoKAgHDx4EDdu3EDdunWxadMmqZ0LTkQ4efIkGjZsiGHDhqFNmzaIiorC6tWrf7qYzMzMhLOzM3R0dODr66uQxSQAiEQitGjRAhs2bEB8fDxOnTqFZs2aYdWqVTA3N0fTpk3h5eWFN2/eCB2VMcYAcEHJ/uVTQckLc8oOkUiEXr16ITIyEu7u7hg3bhxatmyJ8PDwYrV77949dOrUCd26dUPFihVx69Yt+Pr6ombNmj/dJhFh6NChiImJQWBgICpWrFisjGWFsrIyOnfujN27dyMxMREHDhyAsbExpk+fDiMjI9jb22PHjh348OGD0FEZYwqMC0pWSE/vn1NHeISy7KlQoQK2bt2K4OBgpKamonHjxpg9ezaysrKK1M6rV68wcOBANG7cGHFxcThy5AguXboEW1vbYmdcvXo1/Pz8sHv3blhbWxe7vbJIQ0MDvXv3RkBAABISErB9+3YAwPDhw2FoaAhnZ2ccPHiwyP+ujDFWXFxQskKfRoS4oCy7WrZsibt372Lu3LlYvXo16tevj/Pnz3/3dampqZg5cybMzc1x6tQpbN68GeHh4XB0dJTKQpEzZ85gxowZmDlzJnr16lXs9hRBhQoVMGTIEJw7dw5xcXFYsWIFXr9+jT59+sDQ0BADBw7E6dOnkZ+fL3RUxpgC4EU57DO6urqYOXMmpk2bJnQUJmNRUVEYOXIkrly5goEDB2LNmjWFo9Sf5OXlYdu2bVi4cCEyMjIwefJkTJs2Ddra0jvC8OnTp7C1tUXz5s1x9OhRhZ03KS0xMTGFK8UfP34MAwMD9OnTB+7u7mjevDmvFGeMyQQXlOwzZmZmcHZ2VqitWhSZRCLBrl27MGXKFCgrK2PdunXo168fgH9W/c+YMQNPnjzB4MGDsWjRIhgZGUm1//T0dLRo0QLZ2dkIDQ1FhQoVpNq+IiMi3L17Fz4+PvD19UV8fDxq1qwJNzc3uLu7w8rKSuiIjLEyhAtK9pkWLVrA0tISO3fuFDoKK0Fv376Fp6cn/Pz8YGtri4KCAty5cwddunTBypUrZTKnkYjQp08fnDp1Cjdu3OACR4YKCgoQHBwMHx8fHDp0CCkpKahfvz7c3d3h6uqK6tWrCx2RMVbKcUHJPvPrr79CSUkJR44cEToKK2FPnjzBoEGDcO3aNYhEIgwZMgRbtmyBioqKTPpbtmwZZs2ahYCAgBLZeJ39IycnB6dPn4aPjw+CgoKQlZWFli1bwt3dHb179+Y9aBljP4UX5bDP8PGLiuf9+/eYOHEi6tati5cvX2Lr1q2YOHEidu3aBVtbW4SGhkq9zxMnTmD27NmYO3cuF5MlTE1NDY6OjvDz80NCQgL27NmD8uXLY/z48ahSpQocHBywd+9epKWlCR2VMVaKcEHJPqOnp8f7UCqI7OxsrFy5Eqampti1axcWLlyI6OhojBw5EuvWrcOtW7cgFovRvHlz/Pbbb1IrMGJiYuDu7g4HBwcsWLBAKm2yn6OtrQ0PDw8cP34cb968wR9//IGPHz+if//+MDQ0hKurK4KCgpCbmyt0VMaYnONb3uwzy5Ytw5o1a3iUsgyTSCTw8fHB7NmzER8fj1GjRmHevHmoVKnSf56bn5+P9evXY968edDT08OmTZvQvXv3n+47LS0NzZo1g0Qiwc2bN6Gjo1OcL4XJyMuXL+Hn5wcfHx88ePAAurq66NWrF9zd3dG6dWuIxTwWwRj7HL8rsM/o6+sjOTlZasfzMfly4cIF2Nraon///rCxsUFERAQ2bNjwxWIS+OeUlsmTJ+Phw4ewsrKCo6Mj+vTp81NH/kkkEgwYMABxcXEIDAzkYlKOVa9eHdOnT8f9+/cRHh6O0aNH4+zZs2jXrh1MTEwwZcoU3LlzBzwewRj7hAtK9hk9PT0QER/jVsZERETg119/RYcOHaCqqorg4GAEBATA3Nz8h15fs2ZNnDhxAj4+Prh06RIsLS3h7e0NiUTywxkWL16MwMBA7Nu3D3Xq1PnZL4WVsHr16mHJkiV49uwZQkJC4OzsjL///hs2NjawtLTEokWLEBMTI3RMxpjAuKBkn/m0wpNveZcNb968wYgRI1C/fn1ERkbiwIEDCAkJQcuWLYvclkgkgpubG6KiotCrVy+MHDkSrVu3xqNHj7772qCgIMyfPx+LFi0q1i1zJhyRSIQWLVpgw4YNiI+Px6lTp9CsWTOsWrUK5ubmaNq0Kby8vH5q9JoxVvpxQck+86mg5IU5pVt6ejoWLFgAMzMz+Pv7Y+3atYiMjETv3r2LfVJKxYoVsX37dly8eBHv3r1Dw4YNMX/+fGRnZ3/x+VFRUfDw8ECPHj0we/bsYvXN5IOysjI6d+6M3bt3IzExEQcOHICRkRGmT58OIyMj2NvbY+fOnXyngzEFwoty2GcSEhJQuXJlHDlyBI6OjkLHYUWUn5+PnTt3Yv78+UhJScGECRMwa9YsmZ1Ak52djaVLl2L58uWoVasWvL290bp168LHU1NT0bRpUygrK+PGjRtSPbKRyZ+UlBQEBATA19cXFy5cgIqKChwcHApX9WtoaAgdkTEmIzxCyT5TsWJFAHzLu7QhIhw/fhwNGjTAyJEj0aFDBzx+/BgrV66U6XGG6urqWLRoEe7evQs9PT20adMGw4cPR0pKCiQSCTw8PJCQkIDAwEAuJhWArq4uhg4dinPnziEuLg4rVqxAXFwcevfuDUNDQwwcOBBnzpxBfn6+0FEZY1LGBSX7jIqKCnR0dPiWdyly584ddOjQAb/++isMDQ1x+/Zt7N27t0SP07OyskJwcDC2bNmCAwcOwNLSEr1798bx48fh6+sLMzOzEsvC5EPVqlXx22+/4datW4iOjsaUKVNw48YNdO7cGUZGRhg/fjyuX7/OK8UZKyO4oGT/wafllA4vX76Eh4cHbGxs8PbtWxw7dgznz5+HjY2NIHnEYjFGjRqFyMhI1KxZEwEBATAzM0PdunUFycPkh5mZGebNm4eoqCiEhYWhf//+CAgIgJ2dHWrXro3Zs2cjIiJC6JiMsWLggpL9h76+Po9QyrEPHz5g2rRpsLCwwLlz57Bt2zY8ePAADg4OxV5wIw0pKSl4+PAh7OzskJ6ejrp162LdunV8m5NBJBKhcePGWL16NWJjY3Hx4kXY29tj8+bNqFevHho0aIAVK1bg5cuXQkdljBURL8ph/+Hg4AAVFRUEBgYKHYX9S25uLrZs2YJFixYhOzsbU6dOxZQpU1CuXDmhoxVKSUlB06ZNoaGhgZCQEEgkEsyZMwcbN25E48aN8eeff6JRo0ZCx2RyJicnB6dPn4aPjw+CgoKQlZWFli1bwt3dHb179y7cfYIxJr94hJL9B9/yli9EhIMHD6Ju3bqYNGkSXFxc8OTJEyxYsECuismCggL069cPSUlJOHz4MMqVK4fy5cvjjz/+wPXr15GbmwtbW1tMmTIFGRkZQsdlckRNTQ2Ojo7w8/NDQkIC9uzZA21tbYwfPx5VqlSBg4MD9u3bh/T0dKGjMsa+ggtK9h96enp8y1tOXLt2DXZ2dujTpw8sLCzw4MEDeHt7o0qVKkJH+4+5c+fi9OnT8PPzQ+3atT97rFmzZggLC8PixYuxadMmWFlZ4dSpUwIlZfJMW1sbHh4eOHHiBN68eYP169cjNTUVHh4eMDAwgJubG44ePYrc3FyhozLG/oULSvYfPEIpvOjoaPTs2RMtW7ZETk4Ozp8/j+PHj8PKykroaF908OBBLFu2DMuXL0enTp2++BwVFRXMmDEDDx8+hJmZGbp27Qp3d3ckJCSUcFpWWlSqVAljxozB1atX8eLFC8yfPx+PHj2Co6MjKleujJEjR+Ly5ctFOgKUMSYbXFCy/9DX10dycjK/SQvg3bt3GD9+PKysrBAWFoY9e/bg9u3baN++vdDRvurBgwcYNGgQXF1dMWXKlO8+v3bt2jhz5gz+/vtvnDlzBpaWlti5cydvH8O+qXr16pg+fTru37+P8PBwjB49GmfOnEHbtm1hYmKCKVOm4M6dO/x9xJhAeFEO+w9/f3/06tULSUlJhRudM9nKysqCl5cXli9fDpFIhFmzZmHChAlQV1cXOto3JScno0mTJtDR0cG1a9egqalZpNe/f/8ekydPxt9//422bdti27ZtMDc3l1FaVtYQEW7cuAEfHx/s378f7969g4WFBdzd3eHm5sb7nzJWgniEkv3HpxWVfNtb9iQSCXbv3g1zc3PMmzcPgwcPxpMnTzBt2jS5Lybz8/Ph6uqKjx8/4vDhw0UuJoF/vtd2796Ns2fPIjY2FvXr18fixYt5fhz7ISKRCC1atMCGDRsQHx+PU6dOoVmzZli1ahXMzc3RtGlTeHl54c2bN0JHZazM44KS/cengpIX5sjWuXPnYGNjg0GDBqF58+aIjIyEl5dXqdkiZdasWbhw4QL279+PGjVqFKste3t7hIeHw9PTEwsWLECjRo0QEhIinaBMISgrK6Nz587YvXs3EhMTceDAARgZGWH69OkwNjaGvb09du7ciQ8fPggdlbEyiQtK9h96enoAeIRSVsLDw9G1a1d07NgRmpqaCAkJwcGDB2Fqaip0tB/m6+uLVatWYfXq1ejQoYNU2tTU1MSyZctw584dlCtXDr/88gvGjBmD1NRUqbTPFIeGhgZ69+6Nw4cP4+3bt/D29gYRYdiwYTA0NETPnj1x6NAhZGVlCR2VsTKDC0r2H1xQysbr168xdOhQNGzYEE+ePMGhQ4dw9epVtGjRQuhoRXLv3j0MHToUHh4emDhxotTbr1+/PkJCQvDHH39gz549sLS0REBAAC+2YD9FV1cXQ4cOxfnz5xEXF4fly5fj1atX6N27NwwNDTFo0CCcOXOGT3JirJi4oGT/oaKigvLly/MtbylJS0vD3LlzYWZmhiNHjsDLywsRERFwcXGRi6MSi+L9+/fo0aMHLC0t4e3tLbP8SkpKGD9+PB49egRbW1u4uLjA2dkZcXFxMumPKYaqVavC09MToaGhiI6OxpQpU3D9+nV07twZRkZGmDBhAm7cuMEfXhj7CVxQsi/ivSiLLz8/H1u3boWpqSlWr16NiRMn4unTpxg/fjxUVVWFjldk+fn56NOnDzIzM3H48GFoaGjIvM9q1aohMDAQhw4dwq1bt2BpaYkNGzagoKBA5n2zss3MzAzz5s1DVFQUwsLC0L9/f/j7+6NFixaoXbs2Zs+ejYiICKFjMlZqcEHJvkhfX59HKH8SESEoKAjW1tYYM2YMunTpgsePH2PZsmXQ0dEROt5Pmzp1KoKDg3Hw4EGYmJiUWL8ikQguLi549OgRPDw8MGHCBNjZ2eHBgwclloGVXSKRCI0bN8bq1asRGxuLixcvwt7eHps3b0a9evXQoEEDrFixAi9fvhQ6KmNyjQtK9kV6eno8QvkTQkND0bZtWzg5OcHIyAhhYWHYvXt3iRZgsrBnzx54eXlh3bp1aNOmjSAZKlSogC1btuDq1atIT0+HjY0NZs6cyQsrmNQoKSmhbdu28Pb2xtu3b3HkyBFYWlpi4cKFqFGjBlq1aoUtW7bweyNjX8AFJfsivuVdNC9evIC7uzuaNm2K5ORknDhxAmfPnkWjRo2EjlZst2/fxvDhwzFo0CCMHTtW6Dj45ZdfcPfuXcyfPx9r166FtbU1zp07J3QsVsaoqanB0dERfn5+SEhIwJ49e6CtrY3x48ejSpUqcHBwwL59+5Ceni50VMbkAheU7Iv4lvePSUlJwZQpU2BhYYFLly5h+/btuHfvHrp27VrqFtx8SWJiIpydnVG/fn1s2bJFbr4mVVVVzJkzBw8ePICxsTE6duyIgQMH8ocgJhPa2trw8PDAiRMn8ObNG6xfvx6pqanw8PCAgYEB3NzccPToUd6Qnyk0LijZF/Et72/LycnB2rVrUbt2bWzduhVz5sxBTEwMhg4dCiUlJaHjSUVeXh569+6NvLw8BAQEyOXJPRYWFrh48SJ27NiBo0ePok6dOvj77795lS6TmUqVKmHMmDG4evUqnj9/jnnz5iEiIgKOjo6oXLkyRo4cicuXL0MikQgdlbESxQUl+yJ9fX0kJyfzm+L/ICLs378flpaWmDZtGvr06YMnT55g7ty50NLSEjqeVE2aNAkhISE4dOgQjI2NhY7zVSKRCEOGDEFkZCQ6deqEgQMHolOnTnj69KnQ0VgZV6NGDcyYMQMPHjxAeHg4Ro8ejTNnzqBt27YwMTHBlClTcOfOHf6AwxQCF5Tsi/T09FBQUMCnlPxLcHAwmjdvDldXV9SrVw/h4eHYunUrKleuLHQ0qdu1axc2btyIDRs2oGXLlkLH+SGGhobw8fHBiRMnEBMTg3r16mHFihXIy8sTOhpTAPXq1cOSJUvw7NkzhISEwNnZGX///TdsbGxgaWmJRYsWISYmRuiYjMkMF5Tsiz6dJ823vYHHjx+jR48eaN26NSQSCS5evIigoCBYWloKHU0mbt68iVGjRmH48OEYOXKk0HGKrGvXroiIiMDYsWMxa9YsNGnSBDdv3hQ6FlMQIpEILVq0wIYNGxAfH49Tp06hWbNmWLVqFczNzdG0aVN4eXnhzZs3QkdlTKq4oGRf9KmgVOSFOYmJiRgzZgysrKxw7949+Pj44ObNm2jbtq3Q0WTm7du36NmzJ2xsbLBhwwa5WYRTVFpaWli9ejVCQ0OhrKyMFi1aYMKECUhLSxM6GlMgysrK6Ny5M3bv3o2EhAQcOHAARkZGmD59OoyNjWFvb4+dO3fiw4cPQkdlrNi4oGRfpMjneWdmZmLJkiWoXbs2fH19sXz5ckRFRcHNzQ1icdn9kcnNzUWvXr1ARDh06BDU1NSEjlRsjRs3xs2bN7FmzRrs2LEDdevWRVBQkNCxmALS1NRE7969cfjwYbx9+xbe3t4gIgwbNgyGhobo2bMnDh06xPuqslKr7F4dWbF8KigVaYSyoKAAu3btgrm5ORYuXIjhw4fjyZMnmDJlilyucJa2iRMnIjQ0FAEBAahatarQcaRGWVkZnp6eiIiIgLW1NZycnNCrVy/Ex8cLHY0pKF1dXQwdOhTnz59HXFwcli9fjlevXqF3794wNDTEoEGDcObMGeTn5wsdlbEfxgUl+yJVVVVoa2srzAjl6dOn0ahRIwwZMgQtW7ZEVFQU1q5dW1hYl3Xe3t7YunUrNm3ahObNmwsdRyZq1KiB48ePw8/PD8HBwbC0tMTWrVt5JwMmqKpVq8LT0xOhoaF4/PgxJk+ejOvXr6Nz584wMjLChAkTcOPGDV4pzuQeF5TsqxThtJz79++jU6dO6NKlC3R0dHDjxg34+fmhVq1aQkcrMSEhIRg3bhxGjx6NYcOGCR1HpkQiEfr27YvIyEj06dMHo0ePRqtWrRARESF0NMZgbm6O+fPnIyoqCrdv34aHhwf8/f3RokUL1K5dG7Nnz+bvVSa3uKBkX1WWT8uJi4vD4MGD0ahRI7x8+RKHDx/GlStX0KxZM6Gjlaj4+Hi4uLigWbNm8PLyEjpOialYsSL+/PNPXLp0Ce/fv0ejRo0wb948ZGdnCx2NMYhEItjY2GDNmjWIjY3FhQsXYG9vj82bN6NevXpo0KABVqxYgZcvXwodlbFCIuJxdPYVXbt2hYaGBgICAoSOIjUfP37EihUrsG7dOpQrVw4LFizA8OHDoaKiInS0EpeTk4O2bdvi1atXCAsLg6GhodCRBJGdnY1ly5Zh2bJlqFmzJrZt21amV/Kz0isnJwenT5+Gj48PgoKCkJWVhZYtW8Ld3R29e/cu3J2DMSHwCCX7qrJ0yzsvLw+bNm2Cqakp1q5di0mTJuHJkycYM2aMQhaTRISxY8fi7t27OHz4sMIWkwCgrq6OhQsX4t69e6hUqRLatWuHYcOGITk5WehojH1GTU0Njo6O8PPzQ0JCAvbs2QNtbW2MHz8eVapUgYODA/bt24f09HShozIFxAUl+6qycMubiBAYGIh69eph/PjxcHBwQExMDBYvXozy5csLHU8wW7duxY4dO7B161bY2toKHUcu1K1bF1euXMHWrVtx6NAhWFpaws/PjxdDMLmkra0NDw8PnDhxAm/evMH69euRmpoKDw8PGBgYwM3NDUePHkVubq7QUZmC4IKSfZWenl6pHqG8efMmWrduDWdnZ9SoUQN3797Frl275Ppc6pIQHByMCRMmYPz48Rg0aJDQceSKWCzGyJEjERkZidatW8PNzQ3dunXDixcvhI7G2FdVqlQJY8aMwdWrV/H8+XPMmzcPERERcHR0ROXKlTFy5EhcvnyZdzRgMsUFJfuqTyOUpW2E5tmzZ+jbty+aN2+Ojx8/4vTp0zh9+jQaNGggdDTBxcXFoVevXvjll1+wZs0aoePIrSpVquDgwYM4cuQIHj58CCsrK6xZs4b3BWRyr0aNGpgxYwYePHiABw8eYNSoUTh9+jTatm0LExMTTJ06FXfv3i117+tM/nFByb5KT08PBQUFSE1NFTrKD0lKSoKnpyfq1KmDq1evYteuXbhz5w46deokdDS5kJ2dDWdnZ6irq+PgwYMKOXe0qBwdHfHo0SMMHz4cU6dORdOmTREWFiZ0LMZ+iLW1NZYuXYrnz5/j2rVr6NGjB3bv3o3GjRujbt26WLRoEWJiYoSOycoILijZV31aMSjvt72zs7OxatUqmJqaYseOHZg/fz5iYmIwaNAgKCkpCR1PLhARRo0ahYcPH+Lw4cOoVKmS0JFKDW1tbXh5eeHGjRsoKChA06ZNMXnyZF74wEoNkUgEOzs7bNy4Ea9fv8bJkyfRtGlTrFq1Cubm5mjatCm8vLzw5s0boaOyUowLSvZVnwpKeV2YI5FI4OPjgzp16mDmzJlwd3fHkydPMHv2bGhqagodT65s3LgRu3fvxp9//onGjRsLHadUatq0KW7fvo1ly5YV7gd44sSJYrebkZOPiPhU3I1NQUR8KjJy+LY6kx0VFRV06dIFu3fvRkJCAg4cOAAjIyNMnz4dxsbGsLe3x86dO/Hhwweho7JShvehZF8VHx8PIyMjHDt2DA4ODkLH+cylS5cwZcoUhIWFoUePHli+fDksLCyEjiWXLl26BHt7e0ycOJHnTUrJ06dPMXr0aJw9exaurq7w8vIq0tZLMQlp2HczFhcfJyI2ORP/fhMWATCpqIl2Fgbo18wEZobaUs/P2P9KSUlBQEAAfHx8cPHiRaioqMDBwQHu7u5wcHCAhoaG0BGZnOOCkn1VTk4O1NXVsXv3bgwYMEDoOACAyMhITJs2DceOHUPTpk2xevVqtGrVSuhYcuvly5do0qQJGjRogFOnTkFZWVnoSGUGEWHfvn3w9PREfn4+Vq9ejSFDhkAkEn31Na+SMzHrcDiCn7yHkliEAsnX334/Pd7KVB9Lna1RrSKPurOSER8fj/3798PHxwe3b9+GtrY2evbsCXd3d7Rv357fR9gX8S1v9lVqamooV66cXMyhfPv2LUaNGgVra2tERETAz88PN27c4GLyGzIzM+Hs7Ixy5crBz8+PLwJSJhKJ4OHhgcjISDg5OWHYsGFo164dHj9+/MXn+4XGwn7dZYQ8+2cKybeKyX8/HvIsCfbrLsMvNFa6XwBjX1G1alV4enoiNDQUjx8/xuTJk3H9+nV07twZRkZGmDBhAm7cuMErxdlnuKBk3yT0aTkZGRlYtGgRTE1NceDAAaxatQqRkZHo27fvN0eCFB0RYcSIEYiKikJgYCAfySZD+vr6+Ouvv3Du3DnExcWhfv36WLRoEXJycgqfs/FiDGYEhCMnX/LdQvJ/FUgIOfkSzAgIx8aLvCKXlSxzc3PMnz8fUVFRuH37Njw8PODv748WLVqgdu3amDNnDh49eiR0TCYH+JY3+yZbW1s0btwY27ZtK9F+CwoKsGvXLsybNw9JSUmYMGECZs2aBV1d3RLNUVqtXbsWkydPhq+vL1xdXYWOozCysrLw+++/Y9WqVTAzM4O3tzfi1EwwIyBcan2s6GmNvrYmUmuPsaIqKCjAlStX4OPjg0OHDuHDhw9o0KAB3Nzc4OrqiurVqwsdkQmAC0r2TV26dIGWlhb8/f1LpD8iwsmTJzFt2jRERETAzc0NS5YsQc2aNUuk/7Lg3Llz6Ny5M6ZMmYIVK1YIHUchPXjwACNGjEBY1AtUG+UNiUh621epKYtxzrMNz6lkciEnJwenTp2Cj48PgoKCkJ2djZYtW8Ld3R29e/fmuyMKhAtK9k0eHh6Ii4vDpUuXZN7X3bt3MXXqVJw/fx5t2rTB6tWr0aRJE5n3W5Y8f/4cTZo0QZMmTXDixAneh1NABQUFaP97AF5kqUEklt6/g5JYBLtaetgztJnU2mRMGtLS0hAYGAgfHx+cPXsWIpEInTp1gru7O5ycnFCuXDmhIzIZ4jmU7JtKYg5lbGwsBgwYABsbG7x+/RpBQUG4ePEiF5NFlJGRgR49eqBChQrw9fXlYlJgz95n4mWOplSLSeCfOZXBT97jSWKaVNtlrLi0tbXRv39/nDx5Em/evMH69euRmpoKDw8PGBgYwM3NDUePHkVubq7QUZkMcEHJvklPT09mBWVqaipmzJgBc3NznD59Gps3b0Z4eDi6d+/OC26KiIgwdOhQPH36FIGBgahYsaLQkRTevpuxUBLL5vtYSSzC3hu86pvJr0qVKmHMmDG4evUqnj9/jnnz5iEiIgKOjo6oXLkyRo4cicuXL0MikQgdlUkJF5Tsm8pXrISP4vK4I8VTPHJzc/HHH3+gdu3a2LBhA6ZNm4YnT55g1KhRvLXNT1q1ahX279+Pv/76C9bW1kLHYQAuPk4s8oruH1UgIVyMTpRJ24xJW40aNTBjxgw8ePAADx48wKhRo3D69Gm0bdsWJiYmmDp1Ku7evcvbEJVyPIeS/ce/T/F4mZyBf87u+EdxTvEgIgQEBGDGjBl49uwZBg8ejEWLFqFq1arS/yIUyOnTp9G1a1fMnDkTS5YsEToOA5Cekw/rBachyzdXEYCHCzpDS40/hLHSh4hw/fp1+Pj4YP/+/Xj//j3q1KkDd3d3uLm5wdTUVOiIrIi4oGSFZHmKx/Xr1zFlyhSEhISgS5cuWLlyJY+kScGTJ09ga2sLOzs7BAUF8bxJgeXl5SEjIwN3X7zD4P3RMu/v+PiWsKqqI/N+GJOlvLw8nD9/Hj4+Pjh8+DDS09PRtGlTuLm5oW/fvqhSpYrQEdkP4IKSAfjnFI/5QRHIl1CRbtMpiUVQFouw0NEKrl/YG+/JkyeYMWMG/P390bBhQ6xatQr29vbSjK6w0tPT0bx5c+Tm5uLWrVuoUKGC0JFKhYKCAmRmZiI9PR0ZGRmFv773+x95zqfFBqpVzFFl4FqZfy16YTthoJSJChUq/PAvNTU1medi7GdlZmbi2LFj8PHxwYkTJ1BQUIB27drB3d0dPXv25Pc5OcYFJcPGizFYfab4oylTOpljXDszAMD79+/x+++/Y/PmzahcuTKWLFkCDw8PiMU8bVcaiAi9e/fG6dOncfPmTdStW1foSFIlkUiQlZX104Xdt36fnZ393f7FYjG0tLSgpaWFcuXKFf7/l37/pT9LgRaW3pH9W2vT5PMoeP8SHz58+M+vry12UFdXL1IBygUpE0pKSgr8/f3h4+ODS5cuQUVFBQ4ODnB3d4eDgwM0NDSEjsj+hQtKBecXGivVUzx+714H8cGHsHTpUgDAzJkzMXHiRP7Bl7KlS5di9uzZOHz4MHr06CFIBiJCdnZ2sQq9rz0nMzPzhzJ8r7D7mWKwXLlyUFNTK9ZOAxk5+agn4BxKIkJ6evoXC80f/cUFKZMnr1+/xoEDB+Dj44Pbt29DW1sbPXv2hLu7O9q3by/Igs6MnHy8SMpAbr4Eqspi1NDTUug5zVxQKrBXyZmwX3cZOfnS2raBQPl5SNg1DiPcXTB37lxUqlRJSm2zT44fP47u3btj7ty5WLhw4Xefn5ubK5XbuV96zY9s+aGurv7Thd23fq+hoSHXI95tVl3Ey+QfK4x/RnU9TVye0k4mbXNByuRZdHQ0fH19sW/fPsTExMDAwAB9+/aFu7s7mjVrJtNt5/69aDU2OfOzD43FWbRaFnBBqcD677iJkGdJ0t3ahCRobFQOAeNlc6Erq/Lz83+okHvx4gXWr18PY2NjdOzY8YtzAf/3Nfn539/qSVVV9acLu28Vh5qamgq7UGjO4fvYd+sVCNK/uCmJRejfrDoWOFpJvW1p4IKUlQQiwp07d+Dj4wM/Pz/Ex8ejZs2acHd3h7u7u1SnAsly0WpZwQWlgopJSENHrysya/+cZ2uYGpStT2cSiUTqizg+/f5HTo74NBonFothYmICHR0dqY368f6f0pObm4sdO3Zg8YYdUHH6/gjyzyqLP2OffK8gTUlJ+WYxmpqaygWpgikoKMCVK1fg4+ODQ4cO4cOHD2jQoAHc3d3h6uoKE5P/Lhr9UbJatFrWcEGpoBYERWDPzZcy2XhZyNETIkJmZqZUF3F8+pWVlfXd/kUikVRu537p9q6bmxsuXryIW7duwcLCogT+NllR5OfnY+/evVi4cCFevnyJfv36IbPZENx7kyXVnzM+y/v7JBJJsUZIuSAt3XJycnDq1Cn4+PggKCgI2dnZaNWqFdzd3dGrVy/o6+v/cFuyWLRaVnFBqaCEnN9FRMjJyZHqIo5P/5+ZmflDpy1oampKdRHHp/9XV1eXyfydRYsWYcGCBQgKCsKvv/4q9fbZz5NIJDhw4ADmz5+P6OhouLi4YOHChbCyspLBPGVATVmMc55tFOY2mhCELEh1dXW/+piOjg4XpEWUlpaGwMBA+Pj44OzZsxCJROjUqRPc3d3h5OSEcuXKffW10l60uqKnNfqW4ZFKLigVUEmc4gEimN7bgqy0D18s/n50MYc0F3F8+jN5X8zxv4KCguDk5ITff/8dc+bMEToO+z9EhKCgIMydOxfh4eHo1q0bfv/9dzRu3Piz5/FFSfEUtyD98OHDVz8Ya2ho/PToqKIXpImJiTh48CB8fHwQEhICTU1NODo6wt3dHZ07d4aqqmrhc/nDYNFxQamAIuJT4bDhqsz7sYoNQiWVnJ8qBrW0tBR2Mce/RUVFoWnTprC3t8ehQ4dKVSFcVhERzp49izlz5iA0NBTt2rXD4sWLYWdn99XXSOu22dROFhjbjo+kK+vktSCtUKHCZ0VXafbixQv4+flh3759ePjwIXR1ddG7d2+4u7ujVatWGLgrVOqLVsv6dBUuKBXQ3dgUOG8JkXk/h0fboZGJrsz7KatSU1PRtGlTKCsr48aNG9DWLpsLMEqT4OBgzJkzB1euXEHz5s2xZMkStG/f/ode+7MT+0UgqCorYZGjFY9Msh/CBWnRhIeHw9fXFz4+Pnj58iWM6jaBsuMCmfVXVhfUcUGpgEpqhJLPGf55EokEjo6OuHbtGkJDQ2FqyqNSQgoNDcXcuXNx+vRpNGzYEIsXL0a3bt2KPF/2Z7YeyXl5D/7Te8GuAS/EYiVDUQtSIsL169cxy/8unitXg0gs/btk8r7lV3HwXiEKqIaeFkSAzE/xqKGnJcMeyrb58+fjxIkTOHHiBBeTAgoPD8fcuXNx5MgRWFpa4uDBg+jZs+dPTz2oVlETe4Y2+/+bI0cn4mVSBvCvvSpFAEz0NNHO3AA9G1RCt19GYl3ePdgdPCidL4qx7xCLxShfvjzKly//U9vtFLUgffv2LaKiogQvSEUiEezs7EDXciCS0aLVAgnhYnQiFqDsFZQ8QqmgZL3Ku5quOoKndZBZ+2VZQEAAXFxcsGzZMsyYMUPoOAopOjoa8+fPx/79+1GzZk0sWLAA7u7uMpnX+9uU6TgRHIr9B/2/eHzb3r170b9/f1y6dAlt2rSRev+MyRuJRIK0tLSfHh1NTU396YJUU6citn+oA8jgQIJPvnVsamnGBaWCkuU+lCQpQHb4GfSqSRg7dqxUTyso6x4+fIjmzZujW7du2L9/v0yPEGP/9eLFCyxatAi7d+9G1apVMXfuXAwePBgqKioy63P06NG4desWwsLCvvi4RCKBnZ0dsrOzERYWxovVGPuO4hSkH5XKQ7v3UplnLItTwrigVFCyPinHSeUB9nuvR0JCAtq3b49x48ahe/fufCLLN6SkpMDW1haampq4fv06tLR4ykBJiY+Px5IlS/Dnn39CV1cXs2fPxogRI6Curi7zvgcMGIDnz58jODj4q8+5efMmmjdvDm9vbwwfPlzmmRhTVLxo9efxHiQKysxQG61M9aEklu4ImJJYhFam+li/aCZiY2Ph4+OD7Oxs9OzZE7Vq1cKyZcvw7t07qfZZFhQUFMDd3R3JyckIDAzkYrKEvHv3DlOmTEHt2rXh6+uL33//Hc+ePcOECRNKpJgEgIyMjO/+ezdr1gz9+/fH7NmzkZqaWiK5GFNEqsolUxaVVD8lqex9ReyHLXW2hrKUC0plsQhLna0BAKqqqnBzc8O1a9cQFhYGe3t7LFy4ENWqVcOgQYNw+/ZtqfZdms2ZMwdnzpzB/v37UatWLaHjlHkfPnzAnDlzULNmTXh7e2P69Ol4/vw5pk+fXuLFfGZm5g/1uWzZMmRkZOD3338vgVSMKaZPi1ZlqawuWuWCUoFVq6iJhVLeumCRo9UXTwFo3Lgxdu7cidevX2PRokW4dOkSbG1t0bx5c+zduxc5OTlSzVGaHDhwAMuXL8eKFSvQsWNHoeOUaenp6ViyZAlq1qyJtWvXYuzYsXj+/DkWLFgAHR1h5jP9yAglABgZGWHmzJn4448/EBMTUwLJGFMsRISH98KgKZHdglXgn10cytqCHIALSoXnamuCKZ3MpdLW1E4W3914WU9PD9OmTcPTp09x5MgRlC9fHv3790e1atUwZ84cxMXFSSVLafHgwQMMHjwYbm5umDx5stBxyqysrCysXbsWNWvWxKJFi9C/f388e/YMK1asgJ6enqDZMjIyoKn5Y0exTZ48GVWrVuXvFcakhIjw4MEDzJo1C7Vr10bz5s2RGnUdIpLekYv/piQWoZ25gUzaFhoXlAzj2plheU9rqCmLizynkgryoSr+53zhohwJp6SkBEdHR5w5cwaRkZHo27cv1q9fjxo1aqB37964fPnyV7d9KCuSkpLQo0cPmJubY/v27byiWwZyc3OxZcsWmJqaYtq0aXB2dkZMTAz++OMPVK5cWeh4AH78ljfwz5Ynq1atwtGjR3HmzBkZJ2Os7IqJicHvv/8OKysrNGjQAFu3boW9vT3Onz+Pc1vng0SyKY8KJASP5mXzxCsuKBmAf0Yqz3m2gV2tf0ZrvldYfnpcKekpKt32Rp8m1X667zp16mDDhg14/fo11q9fj4cPH6Jt27aoX78+tm3bhoyMjJ9uW17l5+fD1dUVHz9+xOHDh394hIr9mPz8fPz111+wsLDA2LFj0b59e0RFRcHb2/unNmqWpR+95f1Jr1690KpVK3h6eiI/P1+GyRgrW169eoXVq1fDxsYG5ubmWLlyJWxsbHDs2DG8ffsW3t7eaN++PepU0ZHpotWyeOwiwAUl+5dPp3ic/a01+jerjup6mv+ZnCwCUF1PE/2bVcc5z9bY1MsSIWeCEBgYWOz+y5cvj7Fjx+LRo0c4d+4cTE1NMWbMGBgZGcHT0xNPnjwpdh/yYubMmbh48SIOHDiAGjVqCB2nzJBIJPDz84OVlRUGDx4MGxsbhIeHY8+ePXJ74lBRC0qRSIT169cjMjISW7dulWEyxkq/hIQEbNq0Ca1atYKJiUnhYryDBw8iISEBe/bsgYODw39O0JH1otWyiPehZN+UkZOPF0kZyM2XfPEUDwDo0qULnjx5gkePHkn9nNWXL19iy5Yt2L59O5KSktC1a1eMGzcOXbp0+enj74Tm4+ODfv36Yd26dfjtt9+EjlMmEBGCgoIwd+5chIeHo1u3bvj999/RuHFjoaN9l7q6OlatWoXx48cX6XXDhw9HQEAAYmJiULFiRRmlY6z0+fDhAwICAuDn54fz589DLBajU6dOcHV1hZOTE8qXL/9D7czZdQJ7o6VXIq3oaf3ddQalWem8IrMSo6WmDKuqOmhkogurqjpfXJm2evVqPH/+HBs3bpR6/9WrV8fy5cvx6tUr7Nq1CwkJCXBwcIC5uTnWrl2LlJQUqfcpS3fv3sXQoUPRv39/TJw4Ueg4pR4R4cyZM2jWrBl69OgBfX19XLt2DcePHy8VxWRBQQFycnJ+aquixYsXIy8vDwsWLJB+MMZKmYyMDPj6+sLJyQmGhoYYNmwY8vPzsWXLFrx58wbHjx9H//79f7iYDAoKwqpRzjBMuCWVfD+yaLW044KSFVu9evUwYsQILFq0CO/fv5dJHxoaGoV7V16/fh3NmzfHjBkzYGxsjJEjR+LBgwcy6Vea3r17hx49esDKygrbtm3jRTjFFBwcjDZt2qBz585QUlLC+fPnceHCBdjZ2Qkd7YdlZv6zPcnPFJSGhoaYO3cuNm/ejIiICGlHY0zu5eTk4MiRI3B1dYWBgQHc3d2RkJCAlStXIi4uDhcuXMCIESOgr69fpHYPHToEFxcXODo6Injr7J9etKokFkFNWVzkRaulFd/yZlKRmJgIMzMzDBgwABs2bCiRPhMSEuDt7Y2tW7ciPj4erVu3xrhx49CjRw+Znr38M/Ly8tC5c2c8fPgQYWFhqFbt5xcxKbrQ0NDCjeAbNmyIxYsXo1u3bqWyQH/79i2qVKmCoKAgdO/evcivz8nJgZWVFWrXro1Tp06Vyr8DxooiPz8fFy5cgK+vLw4fPozU1FTUr18frq6ucHV1Rc2aNYvVvo+PD/r37w9XV1fs3r278LjgV8mZmHU4HMFP3kNJLEKB5Oul06fHW5nqY6mz9Rf3Zi6TiDEpWbFiBSkpKVFkZGSJ9pubm0sHDhyg1q1bEwCqWrUqLVq0iN68eVOiOb5l4sSJpKysTJcvXxY6Sql1//59cnJyIgBkaWlJhw4dooKCAqFjFcuTJ08IAJ0/f/6n2zhy5AgBoKNHj0oxGWPyo6CggK5cuUJjxoyhSpUqEQAyNTWluXPnUkREhNT62blzJ4lEIho0aBDl5+d/8TnRbz/S/CMPqfWqC1RjxjGq/q9fNWYco9arLtD8Iw8pJuGj1HKVFlxQMqnJysqiGjVqkIODg2AZ7t+/TyNGjCANDQ1SUVGhfv360fXr10kikQiWaffu3QSANm7cKFiG0iwqKopcXV1JJBJRrVq1aM+ePV99sy9tHjx4QADoxo0bP92GRCIhe3t7MjMzo5ycHCmmY0w4EomEQkNDafLkyWRsbEwAyNjYmKZMmUK3b9+W+nv61q1bCQCNHDnyhz+opmfn0cPXH+jOy2R6+PoDpWfnSTVTacMFJZOqAwcOEAA6c+aMoDmSk5NpzZo1VKtWLQJANjY2tGvXLsrMzCzRHKGhoaSmpkaDBw8WtKgtjZ4/f06DBw8msVhMxsbG5O3tTbm5uULHkqrr168TAAoPDy9WO+Hh4SQWi2n16tVSSsaYMB4+fEhz5swhU1NTAkAGBgY0duxYCg4OltkdCS8vLwJAEydO5PfpYuCCkkmVRCKhX375haytreViFKmgoICOHz9OXbt2JQCkp6dH06dPpxcvXsi877dv35KxsTE1bdqUsrKyZN5fWfH69WsaM2YMqaiokIGBAa1fv77M/v2dO3eOANDTp0+L3daYMWOofPnylJCQIIVkjJWcp0+f0pIlS8ja2poAkI6ODg0ZMoTOnDlDeXmyHfVbsWIFAaBp06ZxMVlMXFAyqbt58yYBIG9vb6GjfCY6Opo8PT1JR0eHxGIx9ejRg86dOyeTN5Hc3Fxq1aoVGRoaUlxcnNTbL4sSExNp8uTJpK6uTrq6urR8+XJKT08XOpZMBQUFEQB6+/Ztsdt6//496erq0ogRI6SQjDHZiouLo7Vr11LTpk0JAGlqapKbmxsdOXKEsrOzSyTDokWLCADNmzePi0kp4IKSyUS/fv3IwMCAUlNThY7yH2lpabR161aqV68eAaA6derQxo0b6eNH6U2iHjt2LKmoqNDVq1el1mZZlZKSQrNnzyYtLS3S1tam+fPn04cPH4SOVSJ8fX0JAKWlpUmlvfXr15NIJKK7d+9KpT3GpOndu3e0ZcsWatOmDYlEIlJVVSUnJyfy8/Mr0Q+PEomEZs+eTQBoyZIlJdZvWccFJZOJ2NhYUldXp5kzZwod5askEgldunSJevXqRUpKSqStrU3jxo0r9ir1HTt2EADaunWrlJKWTWlpabR48WKqUKECaWho0LRp0+j9+/dCxypR27dvJwBSmxuWm5tLlpaW1KZNGx5xYXIhNTWVdu/eTV26dCElJSVSUlKiTp060a5duyglJaXE80gkEpo8eTIB4DnHUsYFJZOZOXPmkJqaGj1//lzoKN/16tUrmjNnDhkYGBAA6tixIx05cqTI80Bv3LhBqqqqfNvxGzIzM2nNmjWkr69PqqqqNH78eLna4qkkrV+/ntTV1aXa5smTJwkAHTp0SKrtMvajMjIy6MCBA+Ts7ExqamoEgFq1akWbNm0SdI5vQUEBjR07lnfdkBEuKJnMpKWlUeXKlcnV1VXoKD8sOzub9uzZQ82aNSMAVL16dVqxYsUPjZy9efOGqlatSi1atCixOUClSU5ODm3evJmqVq1KSkpKNHz4cHr58qXQsQS1bNky0tPTk3q7Dg4OVKNGjTK7mInJn5ycHDp69Cj169ePypUrRwCoSZMmtHr1aoqNjRU6HhUUFNCwYcNIJBLJ3fz+soILSiZTn27/hoSECB2lyG7dukUDBw4kNTU1UldXp8GDB1NYWNgXn5uTk0N2dnZUpUoVio+PL+Gk8i0vL4927dpFNWrUIJFIRB4eHhQTEyN0LLkwZ84cMjExkXq7UVFRpKyszPPDmEzl5+fTuXPnaNiwYaSrq0sAqG7duvT7779TdHS00PEK5efn04ABA0gsFtPu3buFjlNmcUHJZCo/P58aNmxIzZo1K7VzuhITE2nZsmVUrVo1AkB2dna0b9++zzaRHjlyJKmqqtL169cFTCpfCgoKyNfXl8zNzQkAubi40MOHD4WOJVc8PT2pTp06MmtbS0uLXr9+LZP2mWKSSCR07do1Gj9+PBkaGhIAqlWrFs2aNYsePHggdLz/yM3NJVdXV1JSUiJfX1+h45RpXFAymbtw4QIBIB8fH6GjFEteXh4FBARQ+/btCQAZGhrSvHnzCvcx2759u9AR5YJEIqHAwMDCPeW6dev21ZFdRTdy5EiysbGRSdspKSmkr69PAwcOlEn7THFIJBK6c+cOTZs2japXr154xK2npyfdvHlTbgcLcnJyyNnZmVRUVCggIEDoOGUeF5SsRDg5OZGJiUmJn1QjKxERETRmzBjS0NAgAFS7dm26cuWK3L6xlgSJREKnT58mW1tbAkDt2rWja9euCR1Lrnl4eFDr1q1l1v6n4+Ru3bolsz5Y2RUVFUXz588nCwuLwoMhRo0aRZcuXZKLgyu+JSsrixwcHEhNTY2OHTsmdByFICIiAmMyFh0dDSsrKyxcuBCzZs0SOo5UvH79Go0bN0a5cuWgpKSEmJgY1K9fH+PGjYO7uzu0tLSEjlhigoODMXv2bAQHB6N58+ZYsmQJ2rdvL3QsudezZ09kZ2fjxIkTMmm/oKAAjRs3hpaWFq5duwaRSCSTfljZ8fLlS/j5+cHPzw/37t1D+fLl4ezsDFdXV3To0AEqKipCR/yuzMxM9OjRA1evXkVgYCA6deokdCSFIBY6AFMM5ubmGDduHJYtW4a3b98KHafYcnJy4OLiAlVVVYSEhCAqKgqnT59G9erVMXLkSBgbG2PKlCl4+vSp0FFlKjQ0FJ07d0br1q2RlpaGY8eOISQkhIvJH5SRkQFNTU2Zta+kpAQvLy9cv34dvr6+MuuHlW5v377Fhg0bYGdnhxo1amDBggUwMzNDQEAAEhIS8Ndff6FLly6lophMT0+Hg4MDQkJCcOLECS4mS5LQQ6RMcSQlJZGuri4NGzZM6CjFIpFIaMiQIaSmpvbFW4nPnj2jqVOnkq6uLolEInJwcKCTJ09KbfNqeXD//n1ycnIiAGRpaUmHDh0qU19fSWnZsiUNGDBA5v307NmTjI2Ny/xRluzHJSUl0Z9//knt27cnsVhMKioq9Ouvv9LevXulempYSfrw4QPZ2dmRtrY2n1ImAC4oWYn6dDTcvXv3hI7y0zZt2kQAvrv9REZGBu3YsYMaNmxIAMjU1JTWrVsnyOkQ0hIVFUWurq4kEomoVq1atGfPHrmfSyXPGjVqRKNHj5Z5P0+fPiVVVVWaP3++zPti8uvjx4+0d+9e+vXXX0lFRYXEYjF16NCB/vzzT0pKShI6XrEkJyeTra0tVahQgW7evCl0HIXEBSUrUbm5uWRubk4dOnQolQtYLl++TMrKyjRhwoQffo1EIqGrV6+Sq6srKSsrk5aWFo0aNYrCw8NlmFS6nj9/ToMHDyaxWEzGxsbk7e1Nubm5Qscq9czNzWny5Mkl0teMGTNIXV1d4TeTVzRZWVnk7+9PvXv3LlxEaGdnR3/88UeZOaHq3bt31LBhQ9LT06M7d+4IHUdhcUHJSlxQUBABoKNHjwodpUhiY2PJwMCA2rZt+9PFVHx8PC1YsIAqV65MAKht27Z06NAhysvLk3Ja6Xj9+jWNHj2aVFRUyNDQkNavX8+nr0iRkZERzZs3r0T6+vjxY6k7uYr9nNzcXDpx4gQNGDCAtLW1CQA1atSIVqxYUSqOwi2Kt2/fkpWVFRkYGJSqD+llEReUrMRJJBJq3749WVhYlJpRrszMTLKxsSETExNKTEwsdns5OTnk5+dHv/zyCwEgY2NjWrx4saDn3P5bYmIiTZo0idTV1UlXV5eWL1/O8+9kQFdXl1asWFFi/e3atYsAUHBwcIn1yUpGfn4+Xbp0iUaOHEl6enoEgCwsLGjBggUUGRkpdDyZiIuLIwsLC6pSpUqZ/RpLEy4omSDu3btHIpGI/vjjD6GjfJdEIqEBAwaQurq6TDbovnPnDg0dOpTU1dVJVVWV+vfvL9gcoOTkZJo9ezZpaWmRtrY2LViwgD58+CBIFkWgqqpKGzduLLH+CgoKqEmTJmRjY8OLqMoAiURCN2/epN9++42qVq1KAKh69eo0ffp0unv3bqmcVvSjXr58SbVr16Zq1arxUa5yggtKJpihQ4dSxYoVKTk5Wego37R+/XoCQHv37pVpP0lJSbRq1SqqUaMGASBbW1vavXt3idxi/vjxIy1evJgqVKhAGhoaNH36dHr//r3M+1VkeXl5BIB27txZov1evXpVkH6ZdEgkEnrw4AHNmjWLatWqVXhq1/jx4ykkJKRMF5GfPH36lKpXr041a9Ysc7fwSzMuKJlg3rx5Q1paWuTp6Sl0lK+6cOECKSkp0aRJk0qsz/z8fDp69Ch16tSJAJC+vj7NnDmTYmNjpd5XZmYmrVmzhvT19UlVVZUmTJhQZibqy7vU1FQCQPv37y/xvl1dXaly5cqldnsYRRQTE0O///471a1blwAUbsF2/vx5hdpp4fHjx2RkZERmZmb06tUroeOwf+GCkglq8eLFpKKiQtHR0UJH+Y8XL16Qvr4+dejQQbBFM1FRUTRhwgTS1tYmsVhMPXv2pAsXLhR7FCInJ4c2b95MVatWJSUlJRo+fDiv/i1h8fHxBECQY+FevnxJGhoaNGPGjBLvm/242NhYWr16NdnY2BAA0tLSon79+tHRo0cpJydH6HglLiIiggwNDalu3boUHx8vdBz2P7igZILKzMykatWqUY8ePYSO8pmMjAxq1KgR1ahRQy5u/X78+JE2b95cODpRt25d2rx5M6WlpRWpnby8PNq1axfVqFGDRCIReXh48PwjgcTExBAAunjxoiD9z58/n1RVVenJkyeC9M++LCEhgTZt2kQtW7YkAKSmpkY9e/akAwcOUEZGhtDxBHPv3j3S19en+vXry83iRfY5LiiZ4Pbt20cA6MKFC0JHIaJ/5ii5u7uThoaG3G3ALpFI6MKFC+Ts7ExisZjKly9PEyZMoMePH3/zdQUFBeTr60vm5uYEgFxcXOjhw4cllJp9yb179wiAYAuwMjIyyNjYmJydnQXpn/1/KSkptHPnTurUqRMpKSmRkpISde3alXbv3s2L4ogoNDSUdHV1ycbGRi4+4LMv44KSCU4ikVCzZs2oYcOGcjEXaPXq1QSA/Pz8hI7yTS9fvqSZM2eSvr4+AaDOnTvT0aNHP/s7lEgkFBgYSNbW1gSAunXrJpOV6qzoQkJCCICghb28fZhTJOnp6eTr60tOTk6kqqpKIpGI2rZtS1u3bqV3794JHU9uhISEUPny5al58+al+pQxRcAFJZML165dk4uVp2fPniWxWEzTp08XNEdRZGVl0e7du6lJkyYEgGrWrEkrV66kgwcPkq2tLQGgdu3a0bVr14SOyv7l7NmzBEDQVaoSiYTs7Oyofv36cru5flmSnZ1NR44cIVdXV9LU1CQA1KxZM1q3bh3FxcUJHU/uXL58mcqVK0etWrXiBWSlABeUTG707duXqlSpUuR5gdLy9OlTqlixInXu3FkuRkp/xs2bN6lTp04kEokIAFWqVIm2bdsmdCz2BYGBgQRA8Plgt27dIgC0ZcsWQXOUVXl5eXTmzBkaPHgw6ejoEACytrampUuX0tOnT4WOJ7fOnTtHGhoa1L59ez5UoZTggpLJjefPn5OamhrNnTu3xPtOT08na2trql27NiUlJZV4/9Jw69atwq2GrKysqH///mRkZEQAqGXLluTn51dqTiZSBJ9uN8vDxXLgwIGkr6/PtxSlpKCggIKDg2nMmDFUqVIlAkCmpqY0d+5cnrv8A06cOEFqamrUpUsXyszMFDoO+0FcUDK5MmPGDNLQ0JDJnotfI5FIqE+fPqSlpVUqz4K9f/8+OTk5EQCytLSkQ4cOFZ6CkpeXR4cOHaK2bdsSAKpSpQotWLCAt9yQA3/++ScBkIsTa16/fi33e8LKO4lEQrdv36YpU6ZQtWrVCo9UnTx5Mt2+fVshNhyXhsDAQFJVVSVHR0fKzs4WOg4rAi4omVxJTU0lAwMD8vDwKLE+ly9fTgDo0KFDJdanNERFRZGrqyuJRCKqVasW7dmz55u36h88eEAjR44kTU1NUlZWJldXV7p27Rpf6ATi5eVFmpqaQscotHTpUlJWVqaoqCiho5QqERERNHfuXDIzMyucZjJmzBi6cuWKXHxYKE0OHDhAysrK1Lt3b76bUgpxQcnkzrZt2wgA3bp1S+Z9nTx5kkQiEc2ePVvmfUnL8+fPafDgwSQWi8nY2Ji8vb2L9OabkpJC69atI1NTUwJAjRo1oh07dvCtpRK2ZMkS0tfXFzpGoaysLKpZsyZ169ZN6Chy7+nTp7R06VKqX78+ASAdHR0aPHgwnT59mhc3/aS9e/eSWCymfv368d9hKcUFJZM7+fn5ZG1tTb/88otMR89iYmKoQoUK5ODgUCoW4bx+/ZpGjx5NKioqZGhoSOvXry/WOd8FBQV08uRJcnBwIJFIRBUrVqSpU6fSs2fPpJiafc3s2bOpevXqQsf4zKFDhwgAnTx5Uugocuf169e0bt06atasGQEgTU1NcnV1pcDAQL41W0w7duwgkUhEgwcPLhXvxezLuKBkcunMmTMEgA4ePCiT9j9+/EhWVlZkZmYm9wsREhMTadKkSaSurk66urq0fPlyqS/kiImJoUmTJlGFChVIJBJR9+7d6cyZM3zLToZ+++03qlu3rtAxPiORSKhNmzZUp04dvuVIRO/fv6etW7dS27ZtSSQSkaqqKjk5OZGvr69cLKYqC7Zs2UIAaNSoUfx+U8pxQcnkloODA9WsWbNYo3BfIpFIqGfPnqStrU2PHj2SatvSlJycTLNnzyYtLS3S1tamBQsWyPzUjPT0dPL29i7cCN3CwoL++OMPSk1NlWm/imj48OFka2srdIz/uHv3LonFYvLy8hI6iiBSU1Pp77//pq5du5KysjKJxWLq2LEj7dy5U+4/fJY269atIwA0ceJEnstdBnBByeTWo0ePSElJiVauXCnVdhcvXkwAKDAwUKrtSsvHjx9p8eLFVKFCBdLQ0KDp06eX+HFjEomErly5Qn369CElJSUqV64cjRkzhiIiIko0R1nm7u5Obdq0ETrGF40YMYIqVKigMCe2ZGZm0sGDB6lnz56kpqZWuNXWpk2bBN8ntKz6tBhy+vTpXEyWEVxQMrk2btw4Kl++vNTe1I8dO0YikYjmz58vlfakKTMzk9asWUP6+vqkqqpKEyZMoDdv3ggdi+Li4mju3LlkYGBAAKh9+/Z0+PBhnjhfTD169JDbBTAJCQlUvnx5GjNmjNBRZCYnJ4eOHTtG/fr1o3LlyhEAsrGxodWrV5fotmWKRiKR0MKFCwkAzZ8/n4vJMoQLSibX3r17Rzo6OjR69OhitxUVFUXly5cnR0dHuZqrk5OTQ5s2baIqVaqQkpISDR8+XC4vaNnZ2bRv3z5q0aIFASATExNatmyZwoxiSVvHjh2pd+/eQsf4qjVr1pBYLKYHDx4IHUVq8vPz6fz58zR8+HCqWLFi4d6tixYtoujoaKHjlXkSiYRmzZpFAGjJkiVCx2FSxgUlk3ufLmzFOWEiNTWV6tSpQ3Xq1JGb+YB5eXm0c+dOql69OolEIvLw8KCYmBihY/2Q27dv0+DBg0lNTY3U1NRo4MCBFBoaKnSsUsXOzo4GDhwodIyvysnJIXNzc+rQoUOpHkWSSCQUEhJCEyZMoMqVKxeedz9z5ky6f/9+qf7aShOJREKTJk0iALRmzRqh4zAZ4IKSyb3s7GyqXbs2denS5adeX1BQQI6OjlS+fHm52LS5oKCAfH19ydzcnABQr169Su3cxHfv3tHy5cvJxMSEAFCzZs1o7969vI3KD2jQoIHc31I+evSoXM83/hqJREJ3796l6dOnU/Xq1QtPifrtt9/oxo0bXESWsIKCAhozZgwBoI0bNwodh8kIF5SsVAgICPjp/fEWLFhAIpGIjh07JoNkP04ikVBgYGDhCmoHBwcKCwsTNJO05OfnU2BgINnb2xMAMjAwoDlz5tCrV6+Ejia3zMzMaOrUqULH+CaJREKdOnWi2rVrl4oPCY8fP6YFCxZQnTp1CADp6enRyJEj6eLFi7y/oUDy8/Np2LBhJBKJ6M8//xQ6DpMhLihZqfBpf7y6desWaTFIYGAgAaDFixfLMN23SSQSOn36NNna2hYuarl27ZpgeWTt0aNHNG7cOCpXrhwpKSlRr1696NKlSzwq9D+qVq1KCxYsEDrGd0VERMhktwVpefHiBa1YsYIaNWpEAEhbW5sGDBhAJ06c4L00BZaXl0f9+/cnsVhMu3fvFjoOkzEuKFmpERYWRiKRiDZv3vxDz3/06BGVK1eOevbsKVgxc+XKFWrVqhUBoObNm9P58+cFySGE1NRU2rBhA1lYWBAAsra2pm3btvGG0P9HR0dHbou0/zV+/HjS1tamt2/fCh2FiIjevn1Lf/zxB9nZ2REAUldXp969e5O/vz8fISoncnNzqW/fvqSkpER+fn5Cx2ElgAtKVqoMHDiQ9PX1v7vBd0pKCpmZmZGVlRV9/PixhNL9f7du3aJOnToRAGrYsCEdO3ZMYUfoJBIJnT17lpycnEgsFpOOjg55enqWmgVIsqKiokKbNm0SOsYPSUpKoooVK9LQoUMFy5CcnEzbt2+nDh06kFgsJmVlZXJwcKC9e/cK8jPOvi47O5t69OhBKioqFBAQIHQcVkK4oGSlSlxcHGlqan5z7ll+fj5169aNKlSoUOJFy/3798nJyalwO5JDhw7J1RZFQnv+/DlNnz69cMuWrl270vHjxxXu7yg3N5cA0F9//SV0lB+2YcMGEolEdOfOnRLrMy0tjfbt20e//vorqaiokEgkovbt29Off/5JSUlJJZaD/bisrCzq1q0bqampCT5vnZUsLihZqbNgwQJSVVWlp0+ffvHx2bNnk0gk+qkFPD8rKiqKXF1dSSQSUa1atWjPnj28COAbMjMzaefOnYXz3mrXrk1r166l5ORkoaOViJSUFJmeVS8LeXl5ZGVlRa1atZLpaHtWVhYFBARQnz59SENDgwBQixYtaP369RQfHy+zflnxZWRkkL29PWloaNCZM2eEjsNKGBeUrNRJT08nIyMj6tWr138eO3ToEAGg5cuXl0iW58+f0+DBg0ksFpOxsTF5e3vzQoAi+LRHoLu7O6moqJCmpiaNGDGC7t+/L3Q0mYqLiyMAdPz4caGjFMmZM2cIAO3fv1+q7ebm5tLJkydp4MCBVL58+cKpIsuXL6fnz59LtS8mG2lpadSmTRvS0tKiixcvCh2HCYALSlYq7d69mwBQcHBw4Z+Fh4eTlpYW9enTR+bzFV+/fk2jR48mFRUVMjQ0pPXr11NWVpZM+yzr3rx5Q4sWLaKqVasSAGrdujUdOHCgTBbo0dHRBIAuXbokdJQi6969O5mYmBR78UtBQQFdunSJRo0aRfr6+gSAzM3Naf78+fTo0SMppWUl4cOHD2RnZ0fly5cv0ztYsG/jgpKVSgUFBWRjY0NNmjShgoICSk5Optq1a1P9+vVluoo4MTGRJk2aROrq6qSrq0vLly/nVctSlpubS/v37y9cHW9kZES///673Kwwloa7d+8SgFJ5ulB0dDSpqKjQ77//XuTXSiQSunXrFnl6epKRkVHhEZ7Tpk2jO3fuKOzCtdIsKSmJmjRpQhUqVKBbt24JHYcJiAtKVmpduXKFANDu3bupc+fOVLFixa/Oqyyu5ORkmj17NmlpaZG2tjYtWLDguyvNWfHdu3ePhg8fThoaGqSiokL9+vWj69evl/rC4+rVqwSg1J6QNGXKFNLU1KS4uLgfen54eDjNmjWLatWqRQDI0NCQxo8fT9euXVO4BVllSWJiIjVs2JD09PTo7t27QsdhAuOCkpVqLi4upK2tTSKRiM6ePSv19j9+/EiLFy+mChUqkIaGBk2fPp3ev38v9X7YtyUnJ9OaNWsKCxIbGxvatWtXqZ1m8Gku4osXL4SO8lM+fPhAlSpVIg8Pj68+JyYmhhYvXkxWVlYEgCpUqEBDhw6lc+fOFelwAiaf3rx5Q1ZWVmRgYEDh4eFCx2FygAtKVqp5eXkRAOrcubNU283MzKQ1a9aQvr4+qaqq0oQJE+jNmzdS7YMVXX5+Ph07doy6dOlSeLTejBkzSl1hdvjwYQJA7969EzrKT/P29iYAdP369cI/e/XqFa1Zs4aaNGlCAEhLS4vc3d3p6NGjlJOTI2BaJk1xcXFkYWFBVatWpcjISKHjMDkhIiICY6XQ/fv3YWdnh+rVq+Ply5eIiYlB1apVi9Vmbm4utm/fjsWLFyMxMRFDhgzB3LlzUa1aNSmlZtISExODzZs3Y+fOnUhPT4ejoyPGjRuH9u3bQyQSCR3vm/bt2wcPDw9kZmZCQ0ND6Dg/paCgADY2NlBWVsbgwYNx4MABBAcHQ1VVFd26dYObmxscHBygqakpdFQmRS9fvkT79u2Rn5+PCxcuoHbt2kJHYnJCLHQAxn5GUlISevToAXNzc5w7dw6ampqYM2fOT7eXn5+PXbt2wdzcHOPGjUOHDh0QFRUFb29vLibllJmZGdatW4fXr19j8+bNiImJgb29PaysrLBp0yakpaUJHfGrMjIyIBKJoK6uLnSUn/Lhwwfs2bMHqqqqCAsLw/jx46GpqYldu3YhISEBAQEB6N27NxeTZczTp0/RunVrAMCVK1e4mGSfE3qIlLGiysvLow4dOpC+vn7hrc5NmzaRSCSisLCwIrVVUFBAvr6+ZG5uTgCoV69epXahhKKTSCR08eJFcnFxISUlJdLW1qbx48dTVFSU0NH+Y926daSlpSV0jCLJyMggPz8/6tGjB6mqqpJIJKI2bdpQ48aNqXLlypSWliZ0RCZDUVFRZGRkRObm5vTq1Suh4zA5xCOUrNSZMWMGLl26hAMHDqB69eoAgBEjRqBOnTqYPHky6AdmcRARjhw5goYNG8LNzQ1mZmYICwvDwYMHUbduXVl/CUwGRCIR2rZti0OHDuH58+eYMGEC/Pz8UKdOHXTq1AlBQUEoKCgQOiaAf0YotbS0hI7xXTk5OQgKCoK7uzsMDAzg6uqK+Ph4LF++HK9evcKlS5fg7++PlJQUrFixQui4TEYiIiLQpk0b6Ojo4NKlSzA2NhY6EpNHQle0jBXF3r17CQB5eXn957ETJ04QADp8+PBXXy+RSOjUqVOFiwbat2/PG/GWYdnZ2fT3339T06ZNCQBVr16dVqxYIfhK/ZkzZ1KNGjUEzfA1eXl5dPbsWRoyZAhVqFCBAJC1tTUtWbKEnjx58sXXzJ49m9TV1flUmzLo3r17pK+vTw0aNKDExESh4zA5xgUlKzXCwsJIXV2dBgwY8MV9CCUSCXXq1IlMTU2/uKL08uXLhZtlt2jRgs6fP18SsZmcuHnzJg0YMIBUVVVJXV2dhgwZQnfu3BEky4QJE8jKykqQvr+koKCArl69SmPHjiUDA4PC89XnzJlDDx8+/O7r09LSqEqVKtS7d+8SSMtKSmhoKOnq6pKNjQ0lJSUJHYfJOS4oWamQmJhIJiYm1KRJk28e+RYeHk5isZjWrl1b+Gc3b96kTp06EQBq1KgRHT9+vNRvjM1+XmJiIi1dupSqVatGAMjOzo58fHxKbFub9Ow86jtyMjWyd6aHrz9QerYwezJKJBIKCwujqVOnkomJSeGpRJMnT6bQ0NAi/4x8Og718uXLMkrMSlJISAiVL1+emjdvzoc4sB/C2wYxwWTk5ONFUgZy8yVQVRajhp4WtNSU//O8vLw8dOrUCY8ePcLt27e/u+p61KhR2L9/P44cOYI1a9YgKCgIdevWxaJFi+Ds7AyxmKcOs39W9gcFBWHjxo24ePEiDA0NMXLkSIwcObLY20/9r5iENOy7GYuLjxMRm5yJf7/pigCYVNREOwsD9GtmAjNDban2/b8iIyPh5+cHPz8/REdHQ19fH71794abmxt++eWXn/75kEgkaNGiBfLy8hAaGgolJSUpJ2cl5cqVK+jWrRsaN26M48ePQ1tbtt+TrGzggpKVqJ+5sE6cOBGbN2/G+fPnC7es+JaQkBC0adMG+fn5qF27NhYsWAA3Nze+wLGvioiIwKZNm/D3338jJycHLi4uGDduHH755Zdi7Wn5KjkTsw6HI/jJeyiJRSiQfP3t9tPjrUz1sdTZGtUqSm/LnefPn2P//v3w8/PD/fv3Ub58efTs2RNubm5o3749lJX/+0HuZ1y/fh12dnbYvn07hg4dKpU2Wck6d+4cHB0dYWdnhyNHjpSKxWNMPnBByUrEz15YbSTR8BwxAJs2bcKYMWO+2ceLFy+wcOFC/P333yhXrhzS09Nx7949WFtbS/vLYWVUamoqdu/ejY0bNyImJgYNGjTAuHHj4O7uXuQ9Ff1CYzE/KAL5Evrm9/v/UhKLoCwWYaGjFVxtTYr6JRR68+YNDhw4AD8/P9y4cQMaGhpwdHSEq6srunTpIrM9MD08PHD27FnExMSgfPnyMumDycaJEyfQs2dPtG/fHv7+/qV2030mDC4omcz97IVVLAIKcnNgmRWBkxvnfHWkKD4+HosXL8b27dtRsWJFzJo1CwMGDECjRo1Qr149HD16VFpfClMQEokEZ8+excaNG3H8+HFUqFABQ4YMwZgxY1CrVq3vvn7jxRisPhNd7BxTOpljXDuzH35+UlIS/P394efnh0uXLkFZWRldu3aFq6srunfvjnLlyhU70/fExcXBwsICY8eOxcqVK2XeH5OOI0eOoHfv3ujWrRv2798PNTU1oSOxUoYLSiZTxb6wEgEi0RcvrO/evcPy5cuxefNmaGhoYPr06Rg3blzhLZoDBw6gb9++OHv2LOzt7YvzZTAF9uzZM2zZsgU7duzAhw8f4ODggHHjxqFjx45fnG/oFxqLGQHhUut/RU9r9P3GSGVaWhoCAwPh5+eHM2fOQCKRoEOHDnB1dYWzszN0dXWlluVHLVq0CIsXL8ajR49gampa4v2zojlw4AD69esHZ2dn7Nu3DyoqKkJHYqUQF5RMZmR1YU1JScGaNWvg5eUFsViMyZMn47fffoOOjs5nzycitGzZEmlpabh79y7PoWTFkpmZCV9fX2zYsAH379+HmZkZxo4di0GDBhV+771KzoT9usvIyZdIrV81ZTHOebb5bE5lVlYWTpw4AV9fXxw/fhzZ2dn45Zdf4Obmhl69esHQ0FBq/f+MzMxMWFpaolGjRggMDBQ0C/u2vXv3YuDAgXBzc8Nff/0ltfm0TPFwQclkQlYX1h6qD+G9dilycnIwYcIETJ06FXp6el99za1bt9CsWTN4e3tj+PDhUsvCFBcR4dq1a9i4cSP8/f2hpqaG/v37Y9y4cVh+Ix0hz5KKNLXje5TEItjV0sPOAY1x9uxZ+Pn5ITAwEGlpaWjcuDHc3NzQp08fmJj8/HxLWdi/fz9cXV35DoEc27lzJ4YNG4bBgwfD29ubP3SzYuGCkslE/x03pX5hJUkBcmLD0dcgETNnzkTlypV/6HWfFgk8efKEt79gUhUfHw9vb29s27YNSXkqqDp8i8z6yjgwA++fPYSlpSXc3NzQt29fmJuby6y/4iIitG7dGikpKbh37x6PfMmZLVu2YMyYMRg9ejQ2btzI26mxYuOCkkldTEIaOnpdkVn75zxbw9TgxwvD2NhYWFhYwNPTE0uXLpVZLqa4cnNzMWjDcYS8UwZEMrgwSwpgLk7AardmsLa2LtZWRiUpLCwMtra22Lhx43d3aWAlZ926dZg0aRJ+++03rF27ttR8PzH5xh9JmNTtuxkLJbFs3qCUxCLsvRFbpNeYmJhgypQpWLt2LV6+fCmTXEyxqaqq4rWkgmyKSQAQKyFHzxT169cvVRd/GxsbDB48GHPnzkVycrLQcRiA5cuXY9KkSZg+fToXk0yquKBkUnfxcaJUb3X/W4GEcDE6scivmz59OnR1dTFjxgwZpGKKLj0nH7HJmTLtIzYpExk5+TLtQxaWLFmCvLw8LFy4UOgoCo2IsHDhQsycORPz58/HsmXLuJhkUsWTWphUleSF9UvHNH5NuXLlsGTJEgwdOhQTJkxAixYtZJhQMRERJBLJT/23OK+Vhzbis8QgVJDt3y+AF0kZsKqq893nypPKlStj9uzZmD17NkaNGgVLS0uhIykcIsLs2bOxbNkyLF26FDNnzhQ6EiuDeA4lk6qI+FQ4bLgq8376V4pDJeWcIl30CwoK8Oeff0JJSQkDBw786QKitBc/smhD0d9GVKuYo8rAtTLv5/BoOzQyKfl9JYsrJycHdevWhZmZGU6ePMkjYyWIiDB58mSsW7cOa9euhaenp9CRWBnFI5RMqnKluE3Qt3j9sREFiU8hEokgFot/6L8ikQj5+fl4+/YtvL29Ua5cuR9+7b/bKOprvtaGkpJSsduQRg5uo/htRCVkoMfWGzL/vldVLp2zlNTU1LBmzRo4OzvjxIkTcHBwEDqSQpBIJBg3bhy2bNnyQ8fXMlYcXFAyqSqpC96NkKs/fevPyckJ9+7dw6NHj/isWiYVZpWVIcI/t6VlRQSghp6WDHuQLScnJ7Rv3x6TJk1Cx44doaqqKnSkMq2goAAjR47Ezp078eeff2LYsGFCR2JlXOn8uMvkVg09Lcj8ZhYRtq9bhv379+PZs2dFvt26atUqxMfHw8vLSzb5mMLRUlOGyb9OspEFEz3NIs0bljcikQheXl548uQJNm3aJHScMi0/Px+DBg3Crl27sHv3bi4mWYnggpJJVUlcWNXy0nD4oB9cXV1Ru3Zt6Ovro3PnzpgzZw4CAwPx+vXrb77e3NwcY8eOxdKlS/H27VuZZmWKo52FgUy3y2pnbiCTtkuStbU1RowYgYULF+Ldu3dCxymT8vLy0K9fP/j6+sLX1xf9+/cXOhJTELwoh0ndgqAI7Ln5UiZbBymJRejfrDoWOFrh3bt3uH37NkJDQwv/+6lArFKlCpo0aQJbW9vC/+rr6xe2k5ycDFNTU/Tq1Qve3t5Sz8kUj7xt6C+v3r17B3Nzc/Tt2xdbt24VOk6ZkpOTg759++LEiRM4cOAAevToIXQkpkC4oGRSJ9SFlYgQHx+P0NDQz4rMlJQUAED16tVha2tbWGTeunULs2fPxt27d1G/fn2Z5WWKQxZHjn46y3vP0GZSa1NoXl5emDx5Mv/sSVFWVhZcXFxw4cIFBAQEoFu3bkJHYgqGC0omE/JyYSUiPHv27LORzLCwMKSnpwMAVFRUoKenh+nTp8PW1haNGjWCpqZsb9mzsutVcibs111GjhR3O1BTFuOcZxtUk/FUkpKUl5cHa2trVK1aFefPn+dthIopMzMTTk5OuHbtGo4cOYKOHTsKHYkpIC4omUzI84W1oKAAjx8/xu3bt3HgwAEcP34cysrKyM/Ph5KSEqysrD67XV6/fn1ekcp+mF9oLGYEhEutvRU9rdHX1kRq7cmLkydPolu3bggICICzs7PQcUqttLQ0/PrrrwgLC8Px48fRpk0boSMxBcUFJZOZ0nBhJSLY29sjLi4Oe/bswf379wtHMsPDw5Gfnw9VVVU0aNCgsMi0tbWFpaUllJSUpJqFlR1z/a5hz/0PABFQjNG3qZ0sMLadqfSCyZlu3bohKioKjx49grq6utBxSp3U1FR07doVEREROHnyJOzs7ISOxBQYF5RMpjZejMHqM9FyfWG9d+8eGjdujPXr12P8+PGFf56VlYX79+9/drs8MjISRARNTU00btz4syKzdu3aEIt54wRFl5GRAVtbW0hqNgc17o18CRVp6oeSWARlsQiLHK3K5Mjkv0VFRcHa2hq///47ZsyYIXScUiU5ORmdO3fGkydPcObMGdja2godiSk4LiiZzI338sOROFUoq6qhKFMqS/LCOmzYMBw+fBhPnjyBru7Xj7ZLS0vDnTt3CovM0NBQPHv2DACgo6ODJk2afFZkVqtWjeeHKZihQ4fCz88Pt2/fRjnD6ph1OBzBT95DSSz6ZmH56fFWpvpY6mxdpuZMfstvv/2GHTt2IDo6GlWqVBE6Tqnw7t07dOzYEXFxcTh37hwaNmwodCTGuKBksvXu3TvUqVMH7bv3hnqrwXJ7YX3z5g3MzMwwYsQIrF1btDOZk5OTcfv27c+KzE97YRoYGPxn+yJDQ0NZfAlMDvj4+KBfv37YuXMnBg8eXPjnMQlp2HczFhejExGblPnZiToi/LNpeTtzA3g0NykTWwMVRUpKCszMzNC9e3fs2rVL6Dhy7+3bt+jQoQOSkpJw7tw51KtXT+hIjAHggpLJ2MCBA3Hs2DFERkbCwMBAri+sS5YswcKFCxEREQEzM7NitfXmzZv/7JH5/v17AICxsfFn2xc1adLkm6OirHSIiYlB48aN4eTkhD179nx1ZDojJx8vkjKQmy+BqrIYNfS0SvUJONKwZcsWjBkzBqGhoWjSpInQceTW69ev0b59e6Snp+PChQuwsLAQOhJjhbigZDJz4cIFdOjQATt27MCQIUP+87i8XVizsrJgYWEBGxsbHD58WKptExFiY2M/2yPz9u3b+PjxIwCgdu3anxWZjRs3Rrly5aSagclOTk4OWrRogfT0dISFhUFbW7FGGYsrPz8fjRo1go6ODoKDg3mayBe8fPkS7du3R35+Pi5cuIDatWsLHYmxz3BByWQiOzsb9evXR5UqVXDp0qVSc4H4dMvy4sWLaNu2rUz7kkgkePLkyWdF5p07d5CVlQWxWAxLS8vPbpc3aNCAV8LKqQkTJmDbtm24efMmz2f7SefPn4e9vT18fX3h6uoqdBy58vTpU7Rv3x7Kysq4cOECqlevLnQkxv6DC0omE/PmzcPy5ctx//59WFpaCh3nh0kkErRo0QJ5eXkIDQ0t8a2B8vPz8ejRo89ul9+/fx95eXlQVlZG/fr1P1v0U7duXaioqJRoRva5wMBAODs7Y8OGDRg3bpzQcUo1Z2dn3L59G48fP+YDBv7P48eP0b59e5QrVw7nz5+HsbGx0JEY+yIuKJnUPXr0CA0bNsTMmTOxcOFCoeMUWUhICH755Rfs2rULgwYNEjoOcnJy8ODBg88W/Tx69AgSiQTq6upo1KjRZ0Wmubk5b19UQmJjY9GwYUO0bdsW/v7+pWYkXl49ffoUdevWxaxZszB//nyh4wju4cOHsLe3h56eHs6fP4/KlSsLHYmxr+KCkkmVRCJBmzZtkJiYiPv375faW7R9+/ZFcHAwoqOj5XIuY0ZGBu7evftZkRkTEwMA0NbWho2NzWdFZo0aNbjYkbK8vDy0bdsWcXFxuHfvHi+skpLp06djw4YNePz4MapVqyZ0HMHcu3cPHTt2hJGREc6ePYtKlSoJHYmxb+KCkknV9u3bMXz4cFy4cAHt2rUTOs5Pe/HiBerUqYPp06eXmlHWDx8+ICws7LMiMzY2FgCgp6f3nz0yq1atKnDi0m3WrFlYuXIlgoOD0aJFC6HjlBkfP36Eubk5OnTogH379gkdRxChoaHo3LkzateujdOnT6NixYpCR2Lsu7igZFKTkJCAOnXqwMnJCX/99ZfQcYptxowZ+OOPPxAdHV1q5y0lJib+Z4/MhIQEAECVKlX+s32Rvr6+wIlLhzNnzqBz585Yvnw5pk+fLnScMmfnzp0YOnQorl27pnDHCYaEhKBr166wsrLCyZMnoaOjI3Qkxn4IF5RMavr164fTp08jKiqqTBQmHz9+hKmpKbp06YK///5b6DhSQUR4/fr1f7YvSklJAQDUqFHjsyLTxsYG5cuXFzi1fHn79i0aNGiARo0a4cSJEzxfVQYkEglsbW0hFotx8+ZNhfk7vnz5MhwcHGBjY4Njx47x9lOsVOGCkknFpxGbv/76CwMHDhQ6jtRs27YNo0aNwq1bt8rsWblEhGfPnn1WZIaFhSEjIwMAYGFh8VmR2bBhQ4VdgVtQUIDOnTsjIiIC9+/fh4GBgdCRyqzg4GC0bt26zL2nfM25c+fg6OiIX375BUeOHFHYnzFWenFByYotMzMT1tbWqF69Os6fP1+mFn982nC5QoUKuHLlSpn62r6loKAAUVFRn21fdO/ePeTk5EBJSQn16tX7bI9Ma2trqKqqCh1b5pYsWYK5c+fi7Nmz6NChg9BxyrxPi+MeP35cpkfrTpw4gZ49e6JDhw7w9/cvtYsZmWLjgpIV26xZs7B27Vo8ePAA5ubmQseRuk+jrwcPHkSvXr2EjiOY3NxcPHz48LMiMzw8HAUFBVBTU0ODBg0+KzItLS1LfB9PWQoODkbbtm0xe/ZsLFq0SOg4CuHly5eoU6cOPD09sXTpUqHjyERgYCD69OmDbt26Yf/+/VBTUxM6EmM/hQtKVizh4eFo3Lgx5s2bh7lz5wodR2YcHBwQGRmJyMhIfsP/l6ysLNy7d++zRT+PHz8GEUFLSwuNGzf+rMg0NTUtlaO8SUlJaNiwIWrWrIkLFy5AWVmxz94uSfPmzcPKlSvx/9q784Co6v194M8MKKK4ILiVG8kiIAIjiA4wo2lS3dzS0sTKyu0WftPqdrnaolaYN3cr07J+ZeaaebHUq4axiSPIsINAirgSgoEOyDDM+f3R1/neuZYJzHBmeV7/kuc8UwkP53w+709hYSE8PDzEjmNSu3btQnR0NB5//HFs376dhxSQVWOhpBbT6/WIiIjA9evXkZWVZdNFq7CwEAEBAVixYgX+9re/iR3HotXW1iIzM9OoZJ47dw4A0K1btzvGF/Xt29eiS6YgCJgwYQLS0tKQlZVltTv+rZVGo4GPjw9GjBiBvXv3ih3HZLZt24ZZs2ZhxowZ+OKLL/hLClk9FkpqsdsbVhITE6FQKMSOY3YxMTHYtm0bSktLOWS4maqqqu4YX3T58mUAQM+ePQ1PMG+XTEva7LJu3TosWrQIBw4cwGOPPSZ2HLu0fft2zJw5E8ePH8eoUaPEjtNqW7duxZw5c/D8889j8+bNNrU0hOwXCyW1yJUrV+Dr64upU6fis88+EztOm7h27Ro8PT0xY8YMfPzxx2LHsXqXL1++o2RWVVUBAPr163fHjMxu3bq1ecaMjAzI5XLExMRgzZo1bX5/+o0gCJDL5aivr8fp06etuoB9/PHHeOmll/DXv/4VH374od2MRCLbx0JJLTJ9+nQkJCSgqKjIrk5xWL16NV5//XXk5OTA399f7Dg2RRAEnD9//o4ZmTdu3AAAeHp6GpVMmUyGTp06mS1PTU0NZDIZunfvjtTUVLvYxW7JTp06hbCwMGzevBlz584VO06LrF27Fq+88goWLlyINWvWWPRSD6LmYqGkZjt06BAeffRRfP3114iOjhY7TptqaGiAv78/vLy8cOjQIbHj2Dy9Xo+SkhKjkqlWq1FfXw+pVApfX1+jkhkYGGiStbyCIOCpp57CoUOHoFar8cADD5jg01BrPfPMMzh8+DCKi4tFeWLdGitWrMDixYsRGxuLuLg4lkmyOSyU1CwajQb+/v7w9vbGv//9b7v8prhv3z5MmTIFhw4dwsMPPyx2HLuj0+lQUFBgVDJzcnLQ2NiIdu3aYejQoUY7y/39/Zu94eHTTz/F3LlzsWvXLjz55JNm+iTUXJcuXYKPjw/mzZuH1atXix3nngiCgGXLlmHZsmVYunQp3nrrLbv8vkm2j4WSmuX111/Hxo0bkZeXh0GDBokdRxSCIGDUqFG4du0asrOzuTvTAty6dQs5OTlGMzILCgqg1+vh7OyM4OBgo5Lp7e39h2vX8vLyEBoaimeeeQabN29u409Cf+a9997D0qVLkZ+fb/FzbwVBwOLFi/H+++9jxYoViI2NFTsSkdmwUNI9y87OxrBhw7B8+XIsXrxY7DiiOn36NEJDQ/Hxxx9j/vz5Yseh33Hz5k2o1WqjTT+lpaUAgC5dumDYsGFGO8sHDBiA+vp6wxnSp06dgrOzs8ifgv5bfX09fH19ERAQgAMHDogd5w8JgoBXXnkF69atw5o1a7Bo0SKxIxGZFQsl3ZOmpibI5XJoNBpkZmZygwKAWbNm4eDBgygpKUHXrl3FjkP34Pr16zh9+rRRybxw4QIAwN3dHR06dEBFRQXWrFmDKVOmoE+fPiInpt+zZ88ePPnkkzh8+DCioqLEjnMHvV6PmJgYbNq0CR999BFefPFFsSMRmR0LJd2Tjz76CDExMUhJSUF4eLjYcSzCpUuX4O3tjZiYGKxcuVLsONRCFRUVyMjIwOeff459+/ahc+fOhp3l9913n9GMzJCQELi5uYmcmG4vO6msrER2drZFnTDT1NSEuXPn4osvvsCnn36KF154QexIRG2ChZL+1KVLl+Dr64sZM2bgk08+ETuORVm2bBni4uJQWFjIncBWrKSkBDKZDBMnTsRXX32FS5cu3TG+6NdffwUAeHh4GO0sHzZsGDp37izuB7BDarUaw4YNw/r167FgwQKx4wD4bcPYrFmzsGPHDnz55ZeYOXOm2JGI2gwLJf2pqVOnIiUlBYWFhXB1dRU7jkXRaDTw9vZGeHg4du/eLXYcaoGGhgbI5XLcuHEDp0+f/t1yKAgCfv75Z6OSmZmZCY1GA4lEAh8fH6OSGRQUxPWXbWDOnDn49ttvUVJSIvqT48bGRkRHR2Pfvn345ptvOB2A7A4LJd3VgQMHMGHCBOzcuRPTpk0TO45F+uqrr/Dss88iOTkZERERYsehZnr55ZfxySef4OTJkwgODr7nP9fU1ISioiKjkpmVlQWtVgtHR0cMGTLE6FV5QECARb2atQUVFRXw8vLCs88+i40bN4qWo6GhAdOmTcPBgwexe/duTJo0SbQsRGJhoaQ/dPPmTfj5+cHf3x8HDx7k7LQ/oNfrMXz4cEilUpw8eZJHqVmR/fv3Y/Lkydi4cSNiYmJafT2tVovc3Fyj8UV5eXloamqCk5MTAgMDjZ5kDh482KqPEbQEq1atQmxsLLKzs0U5vaq+vh5TpkxBQkIC9u3bh0cffbTNMxBZAhZK+kOvvvoqNm3ahPz8fHh4eIgdx6IlJSVBqVRi27ZtXDdlJcrLyxEUFIRRo0bh22+/NdsvTHV1dcjKyjLaWX7mzBkAgIuLC2QymdGTzEGDBvGXt2bQarXw9/eHh4dHmx+2oNFoMHHiRJw4cQLx8fEYO3Zsm92byNKwUNLvyszMRGhoKFasWIHXX39d7DhWYcqUKTh16hTOnDmDjh07ih2H7qKxsRGjRo3CxYsXkZWV1eZrg2tra+8YX1RWVgYAcHV1RUhIiFHJ7Nu3L0vmXcTHx2PixImIj4/H+PHj2+SeN27cwGOPPYbMzEz88MMPUCgUbXJfIkvFQkl3aGpqQlhYGBobG5GRkcF1X/fo559/hq+vL9588028+eabYsehu1i8eDH++c9/IikpCXK5XOw4AIBr164ZdpTfLplXrlwBAPTq1ctofFFoaCh69OghcmLLIQgCxo0bh7KyMuTn55t9Tu6vv/6KRx55BAUFBTh8+DBGjhxp1vsRWQMWSrrD+vXrsWjRIpw4cQIjRowQO45Vee2117Bp0yaUlJTgvvvuEzsO/Y6jR48iKioKcXFxFn8U3uXLlw1rMW+XzOrqagBA//79jUrmsGHD0K1bN3EDiygvLw9BQUF4//338dprr5ntPtXV1Rg3bhzOnj2LI0eOICQkxGz3IrImLJRk5MKFC/Dz88MzzzyDjz76SOw4VufXX3+Fp6cnJkyYgM8//1zsOPRfrl69isDAQAQFBeHQoUNWt4FKEASUlZUZ7Sw/ffq0YRC7l5eX0aaf4OBgdOrUSeTUbScmJgbbtm1DSUkJevbsafLrV1ZWYuzYsbh8+TKOHj2KoKAgk9+DyFqxUJKRSZMm4dSpUygsLORxgi300UcfYcGCBTh9+nSzxtCQeTU1NSEqKgr5+fnIzs42S+EQg16vR3FxsVHJVKvVuHXrFqRSKfz8/IxK5tChQ+Hk5CR2bLOoqqqCl5cXpk6dii1btpj02leuXMHYsWNRVVWFH3/8UZQd5USWjIWSDG6PUNmzZw+mTp0qdhyrpdPpMHToUPTq1QsJCQncTGEh3nvvPbz55ps4evQoxowZI3Ycs2psbERBQYFRyczJyYFOp0O7du0wdOhQo5Lp5+cHR0dHsWObxIYNG7Bw4UKT/kJ38eJFjBkzBhqNBgkJCfD29jbJdYlsCQslAfht16mfnx+Cg4MRHx/PEtRKBw8exF/+8hfs378fEydOFDuO3UtJSYFSqcTixYvxzjvviB1HFLdu3UJ2drbRjMyCggIIggBnZ2cEBwcblUwvLy+rWxIA/FamAwMD0aNHD/z0009G38s0DTqUVWmg1enR3lGKgW6d0Mnp7kW6rKwMDz74IJqampCQkIBBgwaZ+yMQWSUWSgLw22khn332GQoKCjBgwACx41g9QRDw8MMP4+zZs22y65T+WFVVFYKCguDh4YGEhASbeRJnCjdv3kRmZqZRySwtLQUAdO3aFcOGDTMaXzRgwACr+GXz3//+Nx5++GHs2bMHgZFR2K4qx/Ezv6C8ug7/+QNPAqB/944Y7dMT0WH94dXL+NjN0tJSjBkzBo6OjkhISOD3RqK7YKEkpKenIywsDKtWrcIrr7widhybkZeXh8DAQKxevRoLFy4UO45dEgTBMHg6KysLffv2FTuSxbt+/fod44suXrwIAHB3d79jfFHv3r1FTvz7xk1+CsVdhwF9fOEglaBJ/8c/6m5/PdLTHXGTA9Cve0cUFRVhzJgxcHFxQUJCAu6///42TE9kfVgo7ZxOp0NoaCgkEglOnTrFpzcmNn/+fOzatQulpaVwc3MTO47dWbduHRYtWoQDBw7gscceEzuO1bp69eodJbOyshIAcP/99xuVzJCQEHTv3l3UvDvTy/HWv/LQ0KiDRHrvR1s6SCVwlEowd1g3/HPeJPTo0QPHjh2z2NJMZElYKO3c6tWr8frrr0OlUnGemhlUVFTAy8sLzz33HNavXy92HLuSkZEBuVyOmJgYrFmzRuw4NkUQBFy4cMFo009GRgZqamoAAA888IBRyZTJZOjcufOfXNU0PjxeglVHilt9nQ7FR5H8yRIOkCe6RyyUduz8+fPw8/PD7NmzWXbMaOXKlXjjjTeQl5cHHx8fsePYhdraWshkMri6uiI1NZVrWNuAXq/Hzz//bFQyMzMzUVdXB4lEgsGDBxtt+gkKCkKHDh1MmmFnejli9+Wa7HorHw/AtND+JrsekS1jobRTgiBg/PjxyMrKQmFhYZs9PbBHt27dgq+vLwICAhAfHy92HJsnCAJmzJiBH374AWq1mrtyRaTT6VBUVGRUMrOzs6HVauHo6IghQ4YYlcwhQ4a0+KjXC9V1GLs2EQ06vcnyOzlKcWyREv26dzTZNYlsFQulndq7dy+eeOIJfPfdd5g0aZLYcWze7t27MW3aNBw7dszmZyCK7bPPPsOcOXOwa9cuPPnkk2LHof/S0NCA3Nxco53l+fn5aGpqgpOTE4KCgoxKpo+PDxwc/nwd5NNbVThxtuqum2+ay0EqgfwBN2x7Icxk1ySyVSyUdqimpga+vr4YPnw49u/fL3YcuyAIAiIiIgxjWu7lByQ1X15eHkJDQ/HMM89g8+bNYsehe1RXVwe1Wm1UMs+cOQMAcHFxuWN80QMPPGA0vqik4gYeWpdktnzHFing2ZNvcYjuhoXSDr300kv46quvUFBQgH79+okdx26oVCqMGDECn376KWbPni12HJtTV1eH0NBQSKVSnDp1Cs7OzmJHolaoqanB6dOnjXaWnz9/HgDQvXt3hISEGEpmSl0ffJdv2qeTtzlIJXg6bACWTuBRi0R3w0JpZ06ePAm5XI61a9fi5ZdfFjuO3YmOjsaPP/6IkpISrls1sdmzZ+Obb75BRkYG/Pz8xI5DZlBZWXnH+KKrV6/ivnlb0M71PrPdd4BbRyS+Ntps1yeyBSyUdqSxsRHDhg1D+/btoVKp+NpVBOXl5fDx8cErr7yC9957T+w4NmPHjh2YMWMGtm7diueff17sONRGBEFASdkFjNuSg9/OvTEPCYC8pVF/ekwjkT2zvoNaqcXWrl2L/Px8bNmyhWVSJP3798err76K1atXG17fUeuUlJRg7ty5iI6OxnPPPSd2HGpDEokEjU5dYc4yCQACgLIqjVnvQWTtWCjtxLlz57B06VIsXLgQMplM7Dh2LTY2Fq6urvjHP/4hdhSr19DQgOnTp6NPnz7YtGmTVZwzTaalNeGYIEu4D5G1YqG0A4Ig4K9//St69OiBZcuWiR3H7rm4uODdd9/Fjh07cPLkSbHjWLXXX38deXl52LVrF9ek2qn2jm3zY6yt7kNkrbiG0g7s3LkTTz31FM8ztiBNTU0YNmwYOnbsiNTUVD5Za4F//etfmDRpEjZs2IAFCxaIHYfakCAIOHfuHBITE/FjUgpSek0GzPh3iGsoif4cC6WNu379Onx9fREREYG9e/eKHYf+Q0JCAsaMGYOdO3di2rRpYsexKuXl5QgKCoJSqcS+fftYyG2cIAgoLi5GYmIiEhMTkZSUhIsXL0IikWDo0KHQRi1BndR8p9lwlzfRn2OhtHHz5s3Djh07UFRUhPvuM99YDWqZiRMnIjs7G0VFRSY/19hWNTY2YtSoUbh48SLUajW6d+8udiQyMb1ej4KCAqMCWVFRAalUCplMBqVSCaVSiYiICLi6umJpfD62qc5zDiWRiPj83oalpqZiy5Yt+PDDD1kmLdQHH3wAf39/rFu3DrGxsWLHsQpvv/02VCoVkpKSWCZtRFNTE3JycgzlMSkpCVVVVXB0dERoaCiee+45KJVKyOVydOnS5Y4/Hx3WH/8vrcw82fQCZo7ob5ZrE9kSPqG0UVqtFsHBwejcuTNSU1M5JsiCLVy4EJ9//jlKSkrQq1cvseNYtKNHjyIqKgpxcXEs4FZMp9MhMzMTSUlJSExMRHJyMmpqatC+fXuMGDECSqUSCoUCI0eORKdOne7pmjzLm0hcLJQ2Ki4uDm+99RYyMzMxdOhQsePQXVRXV8PT0xNTp07Fli1bxI5jsa5evYrAwEAEBQXh0KFDkEq569ZaaLVapKenGwpkamoqbt68CWdnZ8jlcigUCiiVSoSFhbV46ceF6jqMXZuIBhOO93FylOLYIiX6dTff+kwiW8FCaYNKS0sREBCA//mf/8HKlSvFjkP3YP369XjllVegVqv5C8Dv0Ov1iIqKQl5eHrKysvgk18LdunULKpXKsAYyLS0N9fX1cHFxQXh4uGENZEhICNq3b2+y++5ML0fsvlyTXW/l4wGYFsrX3UT3goXSxgiCgHHjxqG0tBR5eXn3/LqIxKXVajFkyBAMGDAAR44c4a7l/xIXF4c33ngDR48exZgxY8SOQ/9Fo9EgLS3NUCBVKhW0Wi26du2KyMhIQ4EMDg6Go6N5l+5/eLwEq44Ut/o6fxvng5dGe5ogEZF9YKG0Mdu3b8fMmTNx8OBBPPLII2LHoWaIj4/HxIkT8f333+Mvf/mL2HEsRkpKCpRKJRYvXox33nlH7DgEoLa2FqmpqYYCmZGRAZ1OBzc3N8Pra6VSiYCAAFHWb+9ML8fb8fnQ6YVmral0kErgKJVg+QR/PpkkaiYWShtSXV2NwYMH48EHH8TOnTvFjkPNJAgCxowZg8uXLyM3Nxft2rUTO5LoqqqqEBQUBA8PDyQkJJj96Rb9vuvXryM5OdmwCzszMxN6vR69evUylEeFQgE/Pz+LWdt6oboOi7/LRXLpNThIJXctlre/HunpjrjJAVwzSdQCLJQ2ZPbs2di7dy+KiorQu3dvseNQC2RlZUEmk2HDhg2IiYkRO46oBEHApEmTkJKSguzsbPTt21fsSHajsrLSML4nMTEROTk5EAQBffv2NSqQ3t7eFr88o6TiBrarynG8+BeUV9XhP3/gSQD0d+uI0d49MXNEf3j25PGdRC3FQmkjkpKSoFQq8cknn2DevHlix6FWeOGFF7B//36UlpbC1dVV7DiiWb9+PRYuXIj4+HiMHz9e7Dg27cqVK4bymJiYiIKCAgCAh4eHoTwqlUp4eHhYfIG8G02DDmVVGmh1erR3lGKgWycep0hkIiyUNqChoQFBQUHo3r07kpOTLeaVE7XMlStX4OXlhXnz5mH16tVixxHF6dOnMXLkSMTExGDNmjVix7E55eXlRgWypKQEAODt7W20BrJfv34iJyUia8FCaQOWL1+Od955B2q1GkOGDBE7DpnAu+++i+XLlyM/Px9eXl5ix2lTtbW1kMlkcHV1RWpqqknHytgjQRBw7tw5Q3lMTExEWVkZAMDf399QIBUKBfr06SNuWCKyWiyUVq64uBgBAQF49dVXERcXJ3YcMpH6+nr4+PggJCQE+/btEztOmxEEATNmzMAPP/wAtVqNQYMGiR3J6giCgOLiYqMCeenSJUgkEgwdOtTw9DEyMhI9evQQOy4R2QgWSit2e1fw+fPnkZeXB2dnZ7EjkQndHgF1/PhxjBo1Suw4beKzzz7DnDlzsHPnTkybNk3sOFZBr9ejoKDAUB6TkpJQUVEBqVQKmUxmKJARERF2vSaXiMyLhdKKffnll5g1axaOHDmChx56SOw4ZGJ6vR4jR45EY2MjMjIybH5tbH5+PkJDQzFz5kweQXkXTU1NyMnJMZTHpKQkVFVVwdHREaGhoYYCKZfL0aVLF7HjEpGdYKG0UteuXcPgwYPx8MMP4+uvvxY7DplJamoqIiIi8MUXX2DWrFlixzGburo6hIaGQiqVQqVSoWNHzgG8TafTITMz01Agk5OTUVNTAycnJ4SFhRnWP44cOZInYxGRaFgordSsWbMQHx+PoqIi9OzZU+w4ZEbTpk1DcnIySkpKbLYwzJkzB9u3b0dGRgb8/PzEjiMqrVaL9PR0wy7s1NRU3Lx5E87OzpDL5YYCGRYWhg4dOogdl4gIAAulVTp+/DgefPBBfPbZZ3jhhRfEjkNmdu7cOQwePBixsbFYtmyZ2HFMbseOHZgxYwa2bt2K559/Xuw4be7WrVtQqVSGNZBpaWmor6+Hi4sLwsPDDa+wQ0JCuOOdiCwWC6WVuXXrFoYOHYrevXvjp59+svl1dfSb2NhYbNiwAcXFxTZ1YkxpaSmCg4MxYcIEfP3111Y9NPteaTQapKWlGQqkSqWCVqtF165dERkZaSiQwcHBPGqSiKwGC6WVefvtt7FixQpkZ2fD19dX7DjURmpra+Hp6YmHH34YX331ldhxTKKhoQFyuRy1tbXIzMxE5862eexdbW0tUlNTDQUyIyMDOp0Obm5uRkPEAwIC4ODgIHZcIqIWYaG0IoWFhQgMDERsbCyWL18udhxqY5s3b8b8+fORnp6OkJAQseO02sKFC7Fp0yakpaVBJpOJHcdkrl+/juTkZMMmmszMTOj1evTq1ctQHpVKJXx9ffmGgYhsBgulldDr9Rg1ahSuXr2KnJwcLsa3QzqdDkFBQXB1dUVSUpJVvx6Oj4/HxIkTsWHDBixYsEDsOK1SWVlp2ECTlJSEnJwcCIKAvn37GhVILy8vq/5vRkR0NyyUVmLr1q2YPXs2fvzxRzz44INixyGRHDlyBFFRUdi7dy+mTJkidpwWKS8vR1BQEJRKJfbt22d1JevKlSuG8piYmIiCggIAgIeHh2EHtlKphIeHh9V9NiKilmKhtAK//PILBg8ejPHjx+PLL78UOw6J7NFHH8WZM2dQUFAAJycnseM0i06nw6hRo3DhwgWo1Wp0795d7Eh/qry83FAeExMTUVJSAgDw9vY2KpD9+vUTOSkRkXhYKK3AzJkzcfjwYRQVFcHd3V3sOCSygoICDB06FO+//z5ee+01seM0y5IlS7By5UokJSVBLpeLHecOgiDg3LlzRudgl5WVAQD8/f0N5VGhUKBPnz7ihiUisiAslBbu6NGjGDdunM2flELN89JLL+Hrr79GaWkpevToIXace3Ls2DGMGzcOcXFxiI2NFTsOgN8KZHFxsVGBvHTpEiQSCYYOHWpY/xgZGWk1/56JiMTAQmnB6uvrERAQgH79+iEhIYHrscigsrISXl5eiI6OxkcffSR2nD919epVBAUFITAwEIcOHRJtd7Ner0dBQYGhPCYlJaGiogJSqRQymcxQICMiIuDq6ipKRiIia8RCacGWLFmCVatWIScnBz4+PmLHIQuzatUqxMbGIicnx6KPK9Tr9YiKikJeXh6ysrLQq1evNrt3U1MTcnJyDAUyOTkZVVVVcHR0RGhoqKFAyuVydOnSpc1yERHZGhZKC5WXl4fg4GC8+eabeOutt8SOQxaooaEBfn5+8PHxwcGDB8WO84fi4uLwxhtv4OjRoxgzZoxZ76XT6ZCZmWl4+picnIyamho4OTkhLCzMUCBHjBhhs+eiExGJgYXSAun1ekRGRqK6uhpZWVlWt5OX2s63336LqVOn4vDhw4iKihI7zh1SU1OhVCoRGxuLd9991+TX12q1SE9PNxTI1NRU3Lx5E87OzpDL5YYNNGFhYZzdSkRkRiyUFmjLli2YN28eEhMToVAoxI5DFkwQBCiVSsMvH5Z09nN1dTWCgoIwYMAAHD9+3CTZbt26hZMnTxrG+KSlpaG+vh4uLi6IiIgw7MIOCQlB+/btTfApiIjoXrBQWpirV69i8ODBmDJlCrZu3Sp2HLICGRkZCA0NxaZNmzB//nyx4wD4rehOmjQJKSkpyM7ORt++fVt0HY1Gg7S0NMMaSJVKBa1Wi27duiEyMtJQIIODgy2qTBMR2RsWSgvz1FNP4dixYygqKoKbm5vYcchKPPvsszh06BBKSkrQtWtXseNg/fr1WLhwIeLj4zF+/Ph7/nO1tbVITU01FMiMjAzodDq4ubkZyqNSqURAQAAcHBzM+AmIiKg5WCgtyOHDh/HII49g27ZtmDlzpthxyIpcvHgR3t7eWLBgAVauXClqltOnT2PkyJF46aWXsHbt2rv+s9evX0dycrKhQKrVauj1evTq1cvoHGxfX1/RRg0REdGfY6G0EHV1dfD398egQYNw9OhRzpykZlu6dClWrFiBoqIieHh4iJKhtrYWMpkM3bp1Q2pq6h0byiorK42OMczNzYUgCOjbt69RgfTy8uLfASIiK8JCaSH+/ve/Y/369cjLy4Onp6fYccgKaTQaeHt7Izw8HLt3727z+wuCgOjoaHz//fdQq9UYNGgQrly5YtiBnZiYiIKCAgCAh4eHUYEcOHAgCyQRkRVjobQAOTk5kMlkWLZsGZYsWSJ2HLJiX375JWbNmoWUlBSEh4e36b23bt2K2bNn48UXX4RWq0ViYiJKSkoAAN7e3obyqFAo0K9fvzbNRkRE5sVCKbKmpiaEh4fjxo0bUKvVHHVCraLX6xEaGgoHBwecPHnSrOsOBUHA2bNnkZSUhP379+PAgQO4/e3E39/fUB4VCgX69OljthxERCQ+ztkQ2ebNm6FSqZCcnMwySa0mlUqxZs0ajBo1Cjt27EB0dLTJri0IAoqLiw3rHxMTE3Hp0iUAQIcOHeDq6ooPP/wQY8eORY8ePUx2XyIisnx8Qimiy5cvw9fXF9OnT8fmzZvFjkM25PHHH0d6ejrOnDmDjh07tugaer0eBQUFhvKYlJSEiooKSKVSyGQywyvsPXv2YO/evcjIyLDoM8WJiMh8WChF9MQTTyA5ORmFhYVwdXUVOw7ZkNLSUvj5+eGtt97CG2+8cU9/pqmpCTk5OYYCmZycjKqqKjg6OiI0NNRQIOVyObp06QIA2LlzJ5566ils3boVzz//vDk/EhERWTAWSpF8//33GD9+PHbs2IHp06eLHYds0KuvvorNmzejuLgY99133x1f1+l0yMzMNBTIlJQU1NTUwMnJCWFhYYYCOWLECHTq1OmOP19aWgqZTIbx48fj66+/5i5tIiI7xkIpgps3b8Lf3x++vr44dOgQfxCTWfz666/w9PTExIkTsXXrVmi1WqSnpxsK5IkTJ3Dz5k04OztDLpcbCuTw4cPRoUOHu167oaEBcrkctbW1yMzMROfOndvoUxERkSXiphwRLF26FJWVlfjpp59YJslsOnTogOjoaGzcuBG5ubnIy8tDfX09XFxcEBERgSVLlkChUCAkJKTZG8L+/ve/Iy8vD2lpaSyTRETEQtnW1Go11q1bh/fee0+000zINmk0Gpw4ccIwRFylUkGr1UIqleLs2bNYtmwZRo0aheDgYDg6tvyvfnx8PNavX4/169dDJpOZ8BMQEZG14ivvNtTU1IQRI0agoaEBp0+fRrt27cSORFastrYWqamphlfYGRkZ0Ol0cHd3N8x/VCqVuHDhAiZMmID9+/dj4sSJrbrnhQsXEBQUhMjISHz33Xd8wk5ERABYKNvUhg0bsHDhQqSmpmLkyJFixyErc/36dSQnJxsKpFqthl6vR69evYyOMfT19TUaaC4IAqKiolBWVoa8vLwWzzvV6XQYNWoULly4ALVaje7du5vqoxERkZVjoWwjFy9ehK+vL55++ml8/PHHYschK1BZWWl4fZ2YmIjc3FwIgoC+ffsaFUgvL68/fVKYm5uLoKAgrF69GgsXLjT6mqZBh7IqDbQ6Pdo7SjHQrRM6Od35SnzJkiVYuXIlkpKSIJfLTflRiYjIyrFQtpHJkyfj5MmTKCoqQteuXcWOQxboypUrRkPECwoKAAAeHh5GBXLgwIEtetU8b9487NmzB6WlpahqbIftqnIcP/MLyqvr8J/fBCQA+nfviNE+PREd1h9evTrj2LFjGDduHN577z384x//MM0HJiIim8FC2Qb279+PyZMnY/fu3XjiiSfEjkMWory83KhAlpSUAAC8vb0N5VGhUKBfv34muV9FRQV8ZHJ4Rb+FSgd3OEglaNL/8V//218f3r8zkle/iIAH7sPhw4fNej44ERFZJxZKM7tx4wb8/PwQGBiIAwcOcBODnRIEAWfPnjV6hV1WVgYA8Pf3N5RHhUKBPn36mCXDzvRyLNmXDZ1egETq0IzweghNOix52AtzxwwxSzYiIrJuHBtkZm+++Saqq6vx4YcfskzaEUEQcObMGaMCeenSJUgkEgQGBmLChAlQKpWIjIxEjx49zJ7nw+MlWHWkGIAUkuY+YJRIIXFsj7hj56GVOiFmtJc5IhIRkRVjoTSjjIwMbNy4Ef/85z8xcOBAseOQGen1euTn5xsKZFJSEioqKuDg4ACZTIbp06dDqVQiIiKizc9t35le/r9lsvVWHSlGDxcnTAvtb5LrERGRbeArbzPR6XQYPnw4BEFAenp6qwZJk+VpampCTk6O4eljcnIyqqqq4OjoiNDQUMMayPDwcFFPkrlQXYexaxPRoNOb7JpOjlIcW6REv+4dTXZNIiKybmw5ZrJhwwZkZWVBpVKxTNoAnU6HzMxMQ4FMSUlBTU0NnJycEBYWhhdffBFKpRIjR45Ex46WU7QWf5cL3V023rSETi9g8Xe52PZCmEmvS0RE1otPKM3g/Pnz8PPzwwsvvIANGzaIHYdaQKvVIj093VAgT5w4gZs3b8LZ2RlyudzwBHL48OHo0KGD2HF/V0nFDTy0Lsls1z+2SAHPnjzHm4iIWChNThAETJgwAWq1GgUFBejSpYvYkege1NfXQ6VSGdY/pqWlob6+Hi4uLoiIiDDswg4JCWnxSTNtbWl8Prapzt91NFBLOUgleDpsAJZO8Df5tYmIyPrwXayJ7du3D99//z327dvHMmnBNBoNTpw4YdhEo1KpoNVq0a1bN0RGRuKdd96BQqFAcHCw1S5ZOH7mF7OUSQBo0gs4XvwLloKFkoiI+ITSpGpqauDr64vQ0FDs37+fY4IsSG1tLVJTUw2vsDMyMqDT6eDu7m6Y/6hUKhEQEAAHh2bMaLRQNxt0CFj6b5jzL7cEQN7SqN89ppGIiOwLfxKY0JIlS1BbW8uZkxaguroaKSkphgKpVquh1+vRq1cvKJVKPP3001AqlfD19bXJk1/OV2nMWiYBQABQVqWB/308SpSIyN6xUJqISqXCxx9/jDVr1pjsqDy6d5WVlUZDxHNzcyEIAvr27QulUol58+ZBqVTCy8vLLsq+1oRjgizhPkREZNlYKE2gsbERc+fOhUwmw4IFC8SOYxeuXLlidA52QUEBAMDDwwNKpRKLFi2CUqnEwIED7aJA/rf2jm3z1LWt7kNERJaNhdIE1q1bh7y8PKSnp9vE+jtLVF5eblQgS0pKAADe3t5QKpVYvHgxFAoFnw7/r4FunSABzL6GcqBbJzPegYiIrAULZSudO3cOb7/9Nl5++WXIZDKx49gEQRBw9uxZowJZVlYGAPD398dDDz2Ed999F5GRkejTp4+4YS1UJydH9O/eEeer68x2j/5uHbkhh4iIALBQtoogCHjxxRfh7u6O5cuXix3HagmCgDNnzhjKY2JiIi5dugSJRILAwEBMnDgRCoUCkZGR6NGjh9hxrcZon55mnUM52runya9LRETWiYWyFXbv3o3Dhw8jPj4eLi4uYsexGnq9Hvn5+YbymJSUhIqKCjg4OEAmk2H69OlQKpWIiIiAq6ur2HGtVnRYf/y/tDKzXLtJL2DmiP5muTYREVkfzqFsoV9//RWDBw9GeHg4vv32W7HjWLSmpibk5OQYXmEnJyejqqoKjo6OCA0NNRxjGB4ejs6deZSfKT29VYUTZ6tM+pTSQSqB/AE3nuVNREQGLJQtNH/+fHzzzTcoLCzE/fffL3Yci9LY2Ai1Wm0okCkpKaipqYGTkxPCwsIMBXLkyJHo2LGj2HFt2oXqOoxdm4gGE473cXKU4tgiJfp15387IiL6DQtlC5w4cQLh4eHYuHEjYmJixI4jOq1Wi/T0dEOBTE1NhUajgbOzM+RyuaFADh8+HB06dBA7rt3ZmV6O2H25JrveyscDMC2Ur7uJiOj/sFA2U2NjI2QyGTp27IgTJ07Y5Zig+vp6qFQqw/rHtLQ01NfXw8XFBREREYYCOWzYMLRv317suATgw+MlWHWkuNXX+ds4H7w02tMEiYiIyJZwU04zrVq1CoWFhcjIyLCbMqnRaHDixAlDgVSpVNBqtejWrRsiIyPxzjvvQKFQIDg4GI6O/F/KEsWM9oK7ixPejs+HTi80a02lg1QCR6kEyyf488kkERH9Lj6hbIaff/4ZQ4YMQUxMDD744AOx45hNbW0tUlJSDLuwMzIyoNPp4O7uDoVCAaVSCYVCgYCAALsp1bbiQnUdFn+Xi+TSa3CQSu5aLG9/PdLTHXGTA7hmkoiI/hAL5T0SBAFRUVEoLi5Gfn4+OnWynRNCqqurkZKSYlgDqVarodfr0bt3b0N5VCqV8PX1hVTKo/ZsQUnFDWxXleN48S8or6ozOlFHgt+Glo/27omZI/rDsyd33hMR0d2xUN6jb775BtHR0fjhhx/w6KOPih2nVX755RckJycbCmRubi4EQUDfvn0N6x+VSiW8vLzs8hxse6Np0KGsSgOtTo/2jlIMdOvEE3CIiKhZWCjvQXV1NQYPHozRo0dj165dYsdptitXrhjKY2JiIgoLCwEAHh4eRgVy4MCBLJBERETUbCyU92DOnDnYs2cPCgsLreLs6PLycqMCWVpaCgDw9vY2lEeFQoF+/fqJnJSIiIhsgd0Xyj973ZecnAyFQoFNmzZh/vz5Iib9fYIg4OzZs4bymJSUhLKyMgCAv7+/UYHs3bu3uGGJiIjIJtlloTRsSDjzC8qrf2dDQveOGO3TE08E98bUcb+dJ52SkmIRG1IEQcCZM2cM5TExMRGXLl2CRCJBYGCgoUBGRkbC3d1d7LhERERkB+yqULZkZMqtMjW2/c9f8NDI4DZM+n/0ej3y8/MNBTIpKQkVFRVwcHCATCYzPH2MiPit+BIRERG1NbsplDvTy1s01FkCPdo7OmLZBH9Mb4Ohzk1NTcjOzjY8fUxOTkZVVRXatWuH0NBQwwif8PBwdO7McS5EREQkPrsolKY6du61cd6IGe1lgkT/p7GxEWq12rAGMiUlBTU1NXByckJYWJjhFfbIkSPRsSMHSxMREZHlsflCuTO9HLH7ck12vZWPB7Tq+DmtVov09HRDgUxNTYVGo4GzszPkcrmhQA4fPhwdOnQwWW4iIiIic7HpQnmhug5j1yaiQac32TWdHKU4tkh5z8fQ1dfXQ6VSGQpkWloabt26BRcXF0RERBgK5LBhw9C+fXuT5SQiIiJqKzZdKJ/eqsKJs1XNWjP5ZxykEsgfcMO2F8J+9+sajQYnTpwwFMhTp05Bq9WiW7duiIyMNBTIoKAgODryNBIiIiKyfjbbaEoqbiC59JrJr9ukF5Bceg2lv9yAZ8/OqK2tRUpKimETTUZGBnQ6Hdzd3aFQKPDBBx9AoVAgICAADg4OJs9DREREJDabfUK5ND4f21TnTfp08jYpBHg0XURNwmdQq9XQ6/Xo3bu3YYSPUqmEr6+vRcytJCIiIjI3m31CefzML2YpkwCghwSlGicofH0xb948KJVKeHl58RxsIiIisks2WShvNuhQXl1n1ntIu/TEJ2u+MDqmkYiIiMge2eQ72fNVGpj7Pb4AoKxKY+a7EBEREVk+myyUWhOOCbKE+xARERFZMpsslO0d2+ZjtdV9iIiIiCyZTTaigW6dYO7tMZL/vQ8RERGRvbPJQtnJyRH97/Ekm5bq79aRG3KIiIiIYKOFEgBG+/SEg9Q8zykdpBKM9u5plmsTERERWRubLZTRYf3NNoeySS9g5oj+Zrk2ERERkbWx2ULp1aszIj3dTf6U0kEqQaSnOzx7djbpdYmIiIislc0WSgCImxwARxMXSkepBHGTA0x6TSIiIiJrZtOFsl/3jlg2wd+k11w+wR/9zLzhh4iIiMia2HShBIDpof3x2jhvk1zrb+N8MC2UayeJiIiI/pNEEARzn1JoEXaml+Pt+Hzo9EKzNus4SCVwlEqwfII/yyQRERHR77CbQgkAF6rrsPi7XCSXXoODVHLXYnn765Ge7oibHMDX3ERERER/wK4K5W0lFTewXVWO48W/oLyqDv/5L0CC34aWj/buiZkj+nM3NxEREdGfsMtC+Z80DTqUVWmg1enR3lGKgW6deAIOERERUTPYfaEkIiIiotax+V3eRERERGReLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQqLJRERERE1CoslERERETUKiyURERERNQq/x/6+tCJfDntYQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# setup Erdos Renyi graph\n", + "n = 10 # number of nodes/vertices\n", + "m = 20 # number of edges\n", + "\n", + "# define graph object\n", + "G = nx.gnm_random_graph(n, m, seed=seed)\n", + "# positions for all nodes\n", + "pos = nx.spring_layout(G)\n", + "\n", + "# choose random weights\n", + "for u, v in G.edges():\n", + " G.edges[u, v][\"weight\"] = random.uniform(0, 1)\n", + "\n", + "# draw graph\n", + "nx.draw(G, pos)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "# set Ising matrix\n", + "Jfull = nx.to_numpy_array(G)\n", + "\n", + "# get off-diagonal upper triangular matrix\n", + "J = np.triu(Jfull, k=1).astype(np.float64)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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KF9e/dwfW+Lh6maPZiF1tZqprAzh91rs4TtwtLfAl/2bwMXBEldupWLg+D1IzXh2ybWKq02x//55VbXDWw3dMWDsLl2UXKKdx+/DsZIEX3VrCGc7C1y5l47w6YeQmvUsS2UnK5UV9cdpTxE+7SAm9G2M2JgPkJD+FKt2X8NPf15R9olefQqjuvnh2/CmcLKVIDE9FxsO3MSPWwzw5dUGubz55kQKDWdwR44cQU5ODt5/X/2NyTk5OTh58iRatVJ/+ePV1C9bGx4fCCcLIMQ8HfcfeX03A7E9tAWEMz4+sKzeW9dFaE3u/V+RVbBf12Voja1ZKIT0e632e8t1XYTW3Ng3ELU+/lXXZWjNrXW6/Xug9rtLtX7MGwcHaf2Y2qbxSmGLFq9+75q1tXUZJ4REREREpCv6c/MSERERkT4wzqvHxvp6RiIiIiIqiiuFREREREUZ6YMmnBQSERERFWWk32jCy8dERERExJVCIiIiIhXGuVDIlUIiIiIi4kohERERkSo+aEJEREREvHxMREREREaLK4VERERERSiM9JU0nBQSERERFWWk9xTy8jERERERcaWQiIiISIVxLhRypZCIiIiIAJFCoVDouggiIiIifeH90WqtH/PmH/21fkxt07PLx9d1XYCW+EA4WQAh5imQn9V1EVpjJg6AcMZHeL/XTiTv1HURWhPo0h7CGR/h/V4TXh4d4oMmRERERKQvFi5cCE9PT1hYWCAoKAgnTpwose8777wDkUhUbGvfvn2pz8dJIREREVFRonLYNLRx40ZEREQgKioKp0+fhr+/P8LCwpCUlKS2/5YtW/D48WPldvHiRZiYmKB79+6lPicnhURERER6Zs6cORg0aBDCw8NRr149LFmyBFZWVlixYoXa/o6OjnB3d1du+/btg5WVFSeFRERERGUmEml/00B+fj5OnTqF0NBQZZtYLEZoaCji4+NLdYzly5ejV69esLa2LvV59exBEyIiIiIdK4evuZNKpZBKpSptEokEEomkWN+UlBTIZDK4ubmptLu5ueHq1auvPdeJEydw8eJFLF++XKMauVJIREREVM5iYmJgZ2enssXExJTLuZYvX46GDRsiMDBQo/24UkhERERUVDksmUVGRiIiIkKlTd0qIQA4OzvDxMQEiYmJKu2JiYlwd3d/5XlycnKwYcMGfPvttxrXyJVCIiIionIm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SFkA5tFnQsoCCDOP7iy6vFfrxxxar22p++bn58PKygqbNm1Cp06dlO39+/dHRkYGtm/f/sr9FQoFDhw4gI8++gjbtm3De++9V6rzavzdx/b29pg2bRqmTZum6a5ERERERkkqlRZ700pJt9OlpKRAJpPBzc1Npd3NzQ1Xr14t8RyZmZnw8PCAVCqFiYkJFi1aVOoJIWAEL68mIiIi0kR5vJKmIt68UqlSJZw9exb//vsvvv/+e0RERODQoUOl3l/jlUIiIiIi0kxkZCQiIiJU2kp66NbZ2RkmJiZITExUaU9MTIS7u3uJ5xCLxcoHfgMCAnDlyhXExMQUu9+wxP1L1YuIiIjISJTHK2kkEglsbW1VtpImhebm5mjSpAni4uKUbXK5HHFxcQgODi51DrlcrtGXg3ClkIiIiKgIffhauoiICPTv3x9NmzZFYGAg5s2bh5ycHOXTyP369YOHh4fyEnRMTAyaNm2KWrVqQSqVIjY2FmvWrMHixYtLfU5OComIiIj0TM+ePZGcnIzJkycjISEBAQEB2L17t/Lhk/v370MsfnHBNycnB0OHDsWDBw9gaWkJX19frF27Fj179iz1OTV+JU35Esrj9EJ8NQDz6C8h5RFSFoB59JmQsgDCzKM7K6/v0foxw31K965AXeJKIREREVER+vDyal3ggyZERERExJVCIiIioqK4UkhERERERosrhURERERFmIj06BncCsRJIREREVERxnoZ1VhzExEREVERXCkkIiIiKoIPmhARERGR0dKzbzQhIiIi0q1Nd3Zr/ZjdvN7X+jG1Tc8uHwvlK3qE+HVDzKO/hJRHSFkA5tFnPqju/z9dF6E1989NhOd3e3VdhtbcndRWp+c31qePefmYiIiIiPRtpZCIiIhIt/igCREREREZLa4UEhERERVhrCuFnBQSERERFWGsk0JePiYiIiIirhQSERERFWXClUIiIiIiMlZcKSQiIiIqQmykL6/mpJCIiIioCGO9jGqsuYmIiIioCK4UEhERERXBV9IQERERkdEympXCdet2YvnyLUhOToevrxcmTfoCfn4+ui6rzISUR0hZAObRd0LKI6QsgGHk6dezCb7oHwwXZxtcuZ6IydP24NzFRyX2H/hxID7p0QQe7rZIy8hF7L4rmD7/AKT5MgBAYOPqGDygGRrWrQw310r47KvfsPfg9QrJ0rdp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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot Ising matrix\n", + "plt.figure(1, figsize=[7, 5])\n", + "sns.heatmap(J, annot=True, linewidths=0.5, cmap=\"YlGnBu\", annot_kws={\"alpha\": 1})\n", + "plt.title(\"Ising distance matrix\")\n", + "plt.tight_layout();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## IMPLEMENTATION OF QAOA WITH BRAKET " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we load a set of useful helper functions that we will explain in detail below. \n", + "Specifically in ```utils_qaoa.py``` we provide simple building blocks for the core modules of our QAOA algorithm, that is (i) a function called ```circuit``` that defines the parametrized ansatz, (ii) a function called ```objective_function``` that takes a list of variational parameters as input, and returns the cost associated with those parameters and finally (iii) a function ```train``` to run the entire QAOA algorithm for given ansatz. \n", + "This way we can solve the problem in a clean and modular approach.\n", + "Here, we show in markdown the definition of the parametrized QAOA circuit. \n", + "For more details, see the corresponding file ```utils_qaoa.py```. " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], + "source": [ + "from utils_qaoa import circuit, train\n", + "\n", + "# auto reload external files, so that we can edit the external .py file and immediately see the changes here\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```python\n", + "# function to implement evolution with driver Hamiltonian\n", + "def driver(beta, n_qubits):\n", + " \"\"\"\n", + " Returns circuit for driver Hamiltonian U(Hb, beta)\n", + " \"\"\"\n", + " # instantiate circuit object\n", + " circ = Circuit()\n", + " \n", + " for qubit in range(n_qubits):\n", + " gate = Circuit().rx(qubit, 2*beta)\n", + " circ.add(gate)\n", + " \n", + " return circ\n", + "\n", + "\n", + "# helper function for evolution with cost Hamiltonian\n", + "def cost_circuit(gamma, n_qubits, ising):\n", + " \"\"\"\n", + " returns circuit for evolution with cost Hamiltonian\n", + " \"\"\"\n", + " # instantiate circuit object\n", + " circ = Circuit()\n", + "\n", + " # get all non-zero entries (edges) from Ising matrix \n", + " idx = ising.nonzero()\n", + " edges = list(zip(idx[0], idx[1]))\n", + " \n", + " for qubit_pair in edges:\n", + " # get interaction strength\n", + " int_strength = ising[qubit_pair[0], qubit_pair[1]]\n", + " # for Rigetti we decompose ZZ using CNOT gates\n", + " if 'Ankaa' in device.name:\n", + " gate = ZZgate(qubit_pair[0], qubit_pair[1], gamma*int_strength)\n", + " circ.add(gate)\n", + " # classical simulators and IonQ support ZZ gate\n", + " else:\n", + " gate = Circuit().zz(qubit_pair[0], qubit_pair[1], angle=2*gamma*int_strength)\n", + " circ.add(gate)\n", + "\n", + " return circ\n", + "\n", + "\n", + "# function to build the QAOA circuit with depth p\n", + "def circuit(params, n_qubits, ising):\n", + " \"\"\"\n", + " function to return full QAOA circuit\n", + " \"\"\"\n", + "\n", + " # initialize qaoa circuit with first Hadamard layer: for minimization start in |->\n", + " circ = Circuit()\n", + " X_on_all = Circuit().x(range(0, n_qubits))\n", + " circ.add(X_on_all)\n", + " H_on_all = Circuit().h(range(0, n_qubits))\n", + " circ.add(H_on_all)\n", + "\n", + " # setup two parameter families\n", + " circuit_length = int(len(params) / 2)\n", + " gammas = params[:circuit_length]\n", + " betas = params[circuit_length:]\n", + "\n", + " # add circuit layers\n", + " for mm in range(circuit_length):\n", + " circ.add(cost_circuit(gammas[mm], n_qubits, ising))\n", + " circ.add(driver(betas[mm], n_qubits))\n", + "\n", + " return circ\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## VISUALIZATION OF THE QAOA ANSATZ" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us first visualize our parametrized QAOA ansatz for a small number of qubits and fixed (i.e., not optimized) parameters. \n", + "For convenience, the parameters are displayed in the circuit (up to a factor of $2$ we have added in our ansatz definition). \n", + "First we prepare the state $|0,0,\\dots\\rangle \\rightarrow |-,-,\\dots\\rangle$, with the superposition state $|-\\rangle = (|0\\rangle -|1\\rangle )/\\sqrt{2}$. \n", + "Following the discussion above, we choose to start out with this state as it is the minimal energy state of the simple driver Hamiltonian $H_{B}$. \n", + "This state preparation is followed by one layer of the QAOA ansatz, consisting of evolution with the cost Hamiltonian by $\\exp(-i\\gamma H_{C})= \\prod_{j,l}\\exp(-i\\gamma J_{j,l}\\sigma_{j}^{z}\\sigma_{l}^{z}) = \\prod_{j,l} ZZ_{j,l}(2\\gamma J_{j,l})$, followed by the single-qubit driving term, $\\exp(-i\\beta H_{B})= \\prod_{j} \\exp(-i\\beta \\sigma_{j}^{x})= \\prod_{j} R_{j}^{(x)}(2\\beta)$.\n", + "Note that the circuit definition depends on the ```device``` object, as the implementation of the ZZ gate depends on the specific gate set supported by the device. " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Printing test circuit:\n", + "T : |0|1| 2 | 3 |\n", + " \n", + "q0 : -X-H-ZZ(2*gamma)-Rx(2*beta)-\n", + " | \n", + "q1 : -X-H-ZZ(2*gamma)-Rx(2*beta)-\n", + "\n", + "T : |0|1| 2 | 3 |\n", + "\n", + "Unassigned parameters: [beta, gamma].\n" + ] + } + ], + "source": [ + "# create parameters\n", + "gammas = [FreeParameter(\"gamma\")]\n", + "betas = [FreeParameter(\"beta\")]\n", + "params = gammas + betas\n", + "\n", + "# for demonstration purposes use small Ising matrix\n", + "J_sub = np.array([[0, 1], [0, 0]])\n", + "N = J_sub.shape[0]\n", + "\n", + "# get circuit ansatz\n", + "my_simple_circuit = circuit(params, device, N, J_sub)\n", + "\n", + "# print test ansatz circuit\n", + "print(\"Printing test circuit:\")\n", + "print(my_simple_circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that our ansatz produces the expected result for shallow QAOA with $p=1$. \n", + "We run one more sanity check for $p=2$ below. " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Printing test circuit:\n", + "T : |0|1| 2 | 3 | 4 | 5 |\n", + " \n", + "q0 : -X-H-ZZ(2*gamma_1)-Rx(2*beta_1)-ZZ(2*gamma_2)-Rx(2*beta_2)-\n", + " | | \n", + "q1 : -X-H-ZZ(2*gamma_1)-Rx(2*beta_1)-ZZ(2*gamma_2)-Rx(2*beta_2)-\n", + "\n", + "T : |0|1| 2 | 3 | 4 | 5 |\n", + "\n", + "Unassigned parameters: [beta_1, beta_2, gamma_1, gamma_2].\n" + ] + } + ], + "source": [ + "# set number of qubits and fix parameters\n", + "gammas = [FreeParameter(\"gamma_1\"), FreeParameter(\"gamma_2\")]\n", + "betas = [FreeParameter(\"beta_1\"), FreeParameter(\"beta_2\")]\n", + "params = gammas + betas\n", + "\n", + "# for demonstration purposes use small Ising matrix\n", + "J_sub = np.array([[0, 1], [0, 0]])\n", + "N = J_sub.shape[0]\n", + "\n", + "# get circuit ansatz\n", + "my_simple_circuit = circuit(params, device, N, J_sub)\n", + "\n", + "# print test ansatz circuit\n", + "print(\"Printing test circuit:\")\n", + "print(my_simple_circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## QAOA SIMULATION ON LOCAL SCHROEDINGER SIMULATOR" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are now all set to run some QAOA simulation experiments. \n", + "First of all, you can play and experiment yourself with the number of qubits $N$. \n", + "Secondly, you may also experiment with the classical optimizer. \n", + "Since we are using an off-the-shelf, black-box ```scipy``` minimizer (as described in more detail [here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html)), you can simply swap between different optimizers by setting the ```OPT_METHOD``` parameter below. \n", + "Some popular options readily available within this library include *Nelder-Mead*, *BFGS* and *COBYLA*. \n", + "As a precautionary warning, note that the classical optimization step may get stuck in a local optimum, rather than finding the global minimum for our parametrized QAOA ansatz wavefunction. \n", + "To address this issue, we may run several optimization loops, starting from different random parameter seeds. \n", + "While this brute-force approach does not provide any guarantee to find the global optimum, from a pragmatic point of view at least it does increase the odds of finding an acceptable solution, at the expense of potentially having to run many more circuits on the simulator or QPU, respectively.\n", + "Finally, the optimization loop may require the execution of many individual quantum tasks (i.e., single circuit executions for fixed parameters). \n", + "For example, when choosing the classical [Powell](https://docs.scipy.org/doc/scipy/reference/optimize.minimize-powell.html#optimize-minimize-powell) optimizer for the graph considered here, we find $\\sim 270$ cycles in the for loop. \n", + "For the local simulator device chosen here by default this is not an issue, but if you run this algorithm on any QPU you may want to adjust the ```maxfev``` parameter to control the maximum allowed number function evaluations (compare comment in the next code block below)." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "##################################################################################\n", + "# set up hyperparameters\n", + "##################################################################################\n", + "\n", + "# User-defined hypers\n", + "DEPTH = 3 # circuit depth for QAOA\n", + "SHOTS = 1000 # number measurements to make on circuit\n", + "OPT_METHOD = \"COBYLA\" # SLSQP, COBYLA, Nelder-Mead, BFGS, Powell, ...\n", + "\n", + "# set up the problem\n", + "n_qubits = J.shape[0]\n", + "\n", + "# initialize reference solution (simple guess)\n", + "bitstring_init = -1 * np.ones([n_qubits])\n", + "energy_init = np.dot(bitstring_init, np.dot(J, bitstring_init))\n", + "\n", + "# set tracker to keep track of results\n", + "tracker = {\n", + " \"count\": 1, # Elapsed optimization steps\n", + " \"optimal_energy\": energy_init, # Global optimal energy\n", + " \"opt_energies\": [], # Optimal energy at each step\n", + " \"global_energies\": [], # Global optimal energy at each step\n", + " \"optimal_bitstring\": bitstring_init, # Global optimal bitstring\n", + " \"opt_bitstrings\": [], # Optimal bitstring at each step\n", + " \"costs\": [], # Cost (average energy) at each step\n", + " \"res\": None, # Quantum result object\n", + " \"params\": [], # Track parameters\n", + "}\n", + "\n", + "# set options for classical optimization\n", + "options = {\"disp\": True, \"maxiter\": 50}" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Circuit depth hyperparameter: 3\n", + "Problem size: 10\n", + "Starting the training.\n", + "====================================================================\n", + "OPTIMIZATION for circuit depth p=3\n", + "Param \"verbose\" set to False. Will not print intermediate steps.\n", + "====================================================================\n", + "Final average energy (cost):\n", + " Return from subroutine COBYLA because the MAXFUN limit has been reached.\n", + " -0.586455292294228\n", + "Final angles: [5.78684986 4.70523429 6.47840919 0.25681156 1.2539245 2.7942261 ]\n", + "Training complete.\n", + "Code execution time [sec]: 6.3666791915893555\n", + "Optimal energy: -6.486032631497276\n", + "Optimal classical bitstring: [-1 1 -1 -1 1 -1 1 1 -1 -1]\n", + "\n", + " NFVALS = 50 F =-5.864553E-01 MAXCV = 0.000000E+00\n", + " X = 5.786850E+00 4.705234E+00 6.478409E+00 2.568116E-01 1.253925E+00\n", + " 2.794226E+00\n" + ] + } + ], + "source": [ + "##################################################################################\n", + "# run QAOA optimization on graph\n", + "##################################################################################\n", + "\n", + "print(\"Circuit depth hyperparameter:\", DEPTH)\n", + "print(\"Problem size:\", n_qubits)\n", + "\n", + "# kick off training\n", + "start = time.time()\n", + "result_energy, result_angle, tracker = train(\n", + " device=device,\n", + " options=options,\n", + " p=DEPTH,\n", + " ising=J,\n", + " n_qubits=n_qubits,\n", + " n_shots=SHOTS,\n", + " opt_method=OPT_METHOD,\n", + " tracker=tracker,\n", + " verbose=verbose,\n", + ")\n", + "end = time.time()\n", + "\n", + "# print execution time\n", + "print(\"Code execution time [sec]:\", end - start)\n", + "\n", + "# print optimized results\n", + "print(\"Optimal energy:\", tracker[\"optimal_energy\"])\n", + "print(\"Optimal classical bitstring:\", tracker[\"optimal_bitstring\"])\n", + "\n", + "##################################################################################\n", + "# Compute output and dump to pickle\n", + "##################################################################################\n", + "\n", + "if store_results:\n", + " out = {\n", + " \"p\": DEPTH,\n", + " \"N\": n_qubits,\n", + " \"ENERGY_OPTIMAL\": tracker[\"optimal_energy\"],\n", + " \"BITSTRING\": tracker[\"optimal_bitstring\"],\n", + " \"result_energy\": result_energy,\n", + " \"result_angle\": result_angle,\n", + " }\n", + "\n", + " # store results: dump output to pickle with timestamp in filename\n", + " time_now = datetime.strftime(datetime.now(), \"%Y%m%d%H%M%S\")\n", + " results_file = \"results-\" + time_now + \".pkl\"\n", + " print(f\"Writing results to file: {results_file}\")\n", + " pickle.dump(out, open(results_file, \"wb\"))\n", + "\n", + " # you can load results as follows\n", + " # out = pickle.load(open(results_file, \"rb\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## POSTPROCESSING AND COMPARISON OF OUR QAOA RESULTS WITH CLASSICAL RESULTS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this section we visualize the results we have found with QAOA. \n", + "Specifically, we display the results found for the variational parameters $\\beta$ and $\\gamma$ for every layer in our QAOA ansatz. \n", + "Moreover, we show the solution to our graph coloring problem with every node colored either red or blue (recall that there are just two colors since we solve a _binary_ optimization problem).\n", + "Finally, we compare these results to results found classically using the open-source ```pyqubo``` package. \n", + "Ideally, the two results should agree with each other but this is not necessarily the case for several reasons: \n", + "First of all, for the original small toy problem we have set up there are several degenerate classical solutions with the same optimal quality. \n", + "The classical and the QAOA approach may find solutions with different coloring configurations but the same quality (that is energy). \n", + "Secondly, with QAOA we are not guaranteed to find the optimal solutions. \n", + "Specifically, the deeper the circuit, the harder the classical optimization problem, and we may get stuck in a local rather than global optimum. \n", + "One brute-force approach is then to just re-run QAOA with different random initial seeds for the parameters $(\\beta, \\gamma)$." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization on graph with n=10 vertices, m=20 edges, optimized with COBYLA and 1000 shots per call; seed=42.\n" + ] }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file + { + "data": { + "image/png": "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KDAwUH/84x/18MMPa9y4cS4vsiYyDEMFRSWeLgMAAI8LqF1LFovFY+d3OgzVrVvXMU4oLCxMx44dU9u2bSVJZ8+edW11NVhBUYliXl7n6TIAAPC4b/54n+r43dQwZpdw+sxdu3bVF198odtuu03333+/pkyZov3792vFihXq2rWrO2oEAABwm0pNuvhLx48fV35+vjp06KCLFy9qypQp+vLLL9WqVSvNmzdPkZGR7qrVI9w16SK3yQAAuMIdt8mc+f12OgyZDTNQAwDgfZz5/Xb6abKdO3dqx44d16zfsWOHvv76a2cPBwAA4FFOh6EJEyYoMzPzmvVZWVmaMGGCS4oqz5o1axQXF6eAgADZbDYNGjSowvajR4+WxWIps/Tv39+tNQIAAO/i9ADqb7755rqTK3bu3FnffPONS4q6nuXLl2vMmDGaNWuWevfureLiYh04cOCG+/Xv31+LFi1yfLZarW6rEQAAeB+nw5DVatUPP/yg6OjoMuuzs7Pl6+uex+KKi4s1ceJEpaamKiEhwbE+JibmhvtarVY1adKk0ucqLCxUYWGh43NeXp5zxQIAAK/i9G2yfv36KSkpSbm5uY51P/30k1588UXde++9Li3uqvT0dGVlZcnHx0edO3dWWFiYBgwYUKkrQ5s3b1ajRo3UunVrjRs3TufOnauwfUpKioKDgx1LRESEq74GAACohpx+miwrK0t33323zp07p86dO0uS9uzZo8aNG2vDhg1uCQ9Lly7VyJEj1bx5c82bN09RUVGaO3eu1q9fryNHjqh+/frl7lenTh21aNFCx44d04svvqjAwEBt27ZNtWrVuu4+17syFBERwdNkAAB4Ebc/Wn/x4kW9//772rt3rwICAtShQweNHDlStWvXduo4iYmJmj17doVtDh06pPT0dD322GN666239Pvf/17SldDSrFkzvfLKK3rqqacqdb7jx4/rV7/6lT777DP16dOnUvvwaD0AAN7Hmd/vmxrkU7duXUcouRVTpkzR6NGjK2wTHR2t7OxsSWXHCFmtVkVHRysjI6PS54uOjlbDhg119OjRSochAABQs1UqDK1atUoDBgxQ7dq1tWrVqgrbPvTQQ5U+eWhoqEJDQ2/YLjY2VlarVXa7XT169JAkFRUV6eTJk07NeP3999/r3LlzCgsLq/Q+AACgZqvUbTIfHx/l5OSoUaNG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jh3ria8AAACqIa+YZ8iTmGcIAADvU+PmGQIAAHAXwhAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1whAAADA1X08XUN0ZhiFJysvL83AlAACgsq7+bl/9Ha8IYegGLly4IEmKiIjwcCUAAMBZFy5cUHBwcIVtLEZlIpOJlZaW6tSpU6pXr54sFkul9snLy1NERIQyMzMVFBTk5gpBf1ct+rtq0d9Vi/6uWu7sb8MwdOHCBYWHh8vHp+JRQVwZugEfHx81a9bspvYNCgriP6YqRH9XLfq7atHfVYv+rlru6u8bXRG6igHUAADA1AhDAADA1AhDbmC1WpWcnCyr1erpUkyB/q5a9HfVor+rFv1dtapLfzOAGgAAmBpXhgAAgKkRhgAAgKkRhgAAgKkRhgAAgKkRhtxgwYIFioqKkr+/v+Li4vTVV195uqQa4f/9v/+nBx98UOHh4bJYLPr3v/9dZrthGHr55ZcVFhamgIAA9e3bV99++61niq0BUlJS1KVLF9WrV0+NGjXSoEGDZLfby7T5+eefNWHCBDVo0ECBgYEaOnSofvjhBw9V7N3efPNNdejQwTH5XLdu3fTpp586ttPX7vPqq6/KYrFo0qRJjnX0t2vNmDFDFoulzNKmTRvHdk/3N2HIxT788ENNnjxZycnJSk9PV8eOHXXffffp9OnTni7N6128eFEdO3bUggULrrt9zpw5ev3117Vw4ULt2LFDdevW1X333aeff/65iiutGbZs2aIJEyZo+/bt2rBhg4qKitSvXz9dvHjR0ea5557TJ598omXLlmnLli06deqUhgwZ4sGqvVezZs306quvateuXfr666/Vu3dvPfzwwzp48KAk+tpddu7cqbfeeksdOnQos57+dr22bdsqOzvbsXzxxReObR7vbwMudeeddxoTJkxwfC4pKTHCw8ONlJQUD1ZV80gyVq5c6fhcWlpqNGnSxEhNTXWs++mnnwyr1Wp88MEHHqiw5jl9+rQhydiyZYthGFf6t3bt2sayZcscbQ4dOmRIMrZt2+apMmsUm81mvPPOO/S1m1y4cMFo1aqVsWHDBqNnz57GxIkTDcPg37Y7JCcnGx07drzuturQ31wZcqHLly9r165d6tu3r2Odj4+P+vbtq23btnmwsprvxIkTysnJKdP3wcHBiouLo+9dJDc3V5JUv359SdKuXbtUVFRUps/btGmj5s2b0+e3qKSkREuXLtXFixfVrVs3+tpNJkyYoAceeKBMv0r823aXb7/9VuHh4YqOjtZjjz2mjIwMSdWjv3lRqwudPXtWJSUlaty4cZn1jRs31uHDhz1UlTnk5ORI0nX7/uo23LzS0lJNmjRJ3bt3V7t27SRd6XM/Pz+FhISUaUuf37z9+/erW7du+vnnnxUYGKiVK1cqJiZGe/bsoa9dbOnSpUpPT9fOnTuv2ca/bdeLi4vT4sWL1bp1a2VnZ2vmzJn6zW9+owMHDlSL/iYMAbihCRMm6MCBA2Xu8cP1WrdurT179ig3N1cfffSRRo0apS1btni6rBonMzNTEydO1IYNG+Tv7+/pckxhwIABjr87dOiguLg4RUZG6l//+pcCAgI8WNkV3CZzoYYNG6pWrVrXjID/4Ycf1KRJEw9VZQ5X+5e+d72nn35aq1ev1qZNm9SsWTPH+iZNmujy5cv66aefyrSnz2+en5+fWrZsqdjYWKWkpKhjx476y1/+Ql+72K5du3T69Gndfvvt8vX1la+vr7Zs2aLXX39dvr6+aty4Mf3tZiEhIfr1r3+to0ePVot/34QhF/Lz81NsbKw2btzoWFdaWqqNGzeqW7duHqys5mvRooWaNGlSpu/z8vK0Y8cO+v4mGYahp59+WitXrlRaWppatGhRZntsbKxq165dps/tdrsyMjLocxcpLS1VYWEhfe1iffr00f79+7Vnzx7Hcscdd+ixxx5z/E1/u1d+fr6OHTumsLCw6vHvu0qGaZvI0qVLDavVaixevNj45ptvjN///vdGSEiIkZOT4+nSvN6FCxeM3bt3G7t37zYkGfPmzTN2795tfPfdd4ZhGMarr75qhISEGB9//LGxb98+4+GHHzZatGhhFBQUeLhy7zRu3DgjODjY2Lx5s5Gdne1YLl265GgzduxYo3nz5kZaWprx9ddfG926dTO6devmwaq9V2JiorFlyxbjxIkTxr59+4zExETDYrEY69evNwyDvna3Xz5NZhj0t6tNmTLF2Lx5s3HixAlj69atRt++fY2GDRsap0+fNgzD8/1NGHKDN954w2jevLnh5+dn3Hnnncb27ds9XVKNsGnTJkPSNcuoUaMMw7jyeP1LL71kNG7c2LBarUafPn0Mu93u2aK92PX6WpKxaNEiR5uCggJj/Pjxhs1mM+rUqWMMHjzYyM7O9lzRXuyJJ54wIiMjDT8/PyM0NNTo06ePIwgZBn3tbv8dhuhv1xo+fLgRFhZm+Pn5GU2bNjWGDx9uHD161LHd0/1tMQzDqJprUAAAANUPY4YAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAAICpEYYAuF1UVJTmz59/S8eYMWOGOnXq5JJ6ynPy5ElZLBbt2bPHredxp5rwHYCqxgzUAFxm8eLFmjRp0jVvnz5z5ozq1q2rOnXq3PSx8/PzVVhYqAYNGtxilVeMHj1aP/30k/7973871pWUlOjMmTNq2LChfH19XXKeqnby5Em1aNFCu3fvdnt4BGoK7/yvHYBXCQ0NveVjBAYGKjAw0AXVlK9WrVpq0qSJW88BoPrhNhkASVJhYaGeffZZNWrUSP7+/urRo4d27tzp2L5582ZZLBatWbNGHTp0kL+/v7p27aoDBw44tj/++OPKzc2VxWKRxWLRjBkzJF17m8xiseitt97SwIEDVadOHd12223atm2bjh49ql69eqlu3bq66667dOzYMcc+/32b7Oo5frlERUVJunKFJyEhQS1atFBAQIBat26tv/zlL2WOtWTJEn388ceOfTdv3nzdW0xbtmzRnXfeKavVqrCwMCUmJqq4uNixvVevXnr22Wc1depU1a9fX02aNHF874q89957atu2reO4Tz/9tCTpiSee0MCBA8u0LSoqUqNGjfTuu+9KkkpLSzVnzhy1bNlSVqtVzZs315///Odyz3XgwAENGDBAgYGBaty4seLj43X27Nkb1giYRpW9EhZAtfbss88a4eHhxn/+8x/j4MGDxqhRowybzWacO3fOMAzD2LRpkyHJuO2224z169cb+/btMwYOHGhERUUZly9fNgoLC4358+cbQUFBRnZ2tpGdnW1cuHDBMAzDiIyMNF577TXHuSQZTZs2NT788EPDbrcbgwYNMqKioozevXsba9euNb755huja9euRv/+/R37JCcnGx07dnR8vnqO7Oxs4+jRo0bLli2N+Ph4wzAM4/Lly8bLL79s7Ny50zh+/Ljxz3/+06hTp47x4YcfGoZhGBcuXDAeeeQRo3///o5jFBYWGidOnDAkGbt37zYMwzC+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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualize the optimization process\n", + "cycles = np.arange(1, tracker[\"count\"])\n", + "optim_classical = tracker[\"global_energies\"]\n", + "\n", + "# print information\n", + "info = \"Optimization on graph with n={} vertices, m={} edges, optimized with {} and {} shots per call; seed={}.\"\n", + "print(info.format(n, m, OPT_METHOD, SHOTS, seed))\n", + "\n", + "plt.plot(cycles, optim_classical)\n", + "plt.xlabel(\"optimization cycle\")\n", + "plt.ylabel(\"best classical minimum\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimal energy found with QAOA: -6.486032631497276\n", + "Optimal bit-string found with QAOA: [-1 1 -1 -1 1 -1 1 1 -1 -1]\n" + ] + } + ], + "source": [ + "# print the optimal energy found with QAOA\n", + "print(\"Optimal energy found with QAOA:\", tracker[\"optimal_energy\"])\n", + "# print the corresponding bitstring\n", + "print(\"Optimal bit-string found with QAOA:\", tracker[\"optimal_bitstring\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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evvttxEdHY333nsPBgYGqvJhw4bhP//5T5cG15YtW7Zg/vz52LJlC6ZMmXLD+pWVlUhLS4OTk5PWYyMiIqLeQeMEaNOmTfjqq6/w6KOPqq36CgwMxNmzZzVqq7KyEklJSUhKSgIApKenIykpSTVpeenSpZg7d66q/ubNmzF37lysW7cOISEhyMvLQ15eHsrKylR1Xn75ZRw4cAAZGRmIi4vD/fffD5lMhtmzZ2v6UomIiKiP0jgBysnJgbe3d6typVKJhoYGjdpKSEjA8OHDVUvYo6KiMHz4cCxbtgwAkJubq7aC66uvvkJjYyOee+45ODk5qT5efPFFVZ3Lly9j9uzZ8PX1xYwZM2BjY4PDhw/Dzs5O05dKREREfZTGq8D8/Pzw999/w8PDQ618x44danvxdMa4cePQ0Rzs6OhotcedOWpj69atGsVARERE/Y/GCdCyZcsQGRmJnJwcKJVK/Pjjjzh37hw2bdqEX3/9VRsxEhEREXUpjYfApk2bhl9++QV79+6FiYkJli1bhjNnzuCXX37BxIkTtREjERERUZe6pX2A+ipN9hEgIiKinkGr+wARERER9XadmgNkZWUFiUTSqQavXr16SwERERERaVunEqDrT2EnIiIi6s06lQBFRkZqOw4iIiKibqPxMvjy8vI2yyUSCeRyudrxGEREREQ9kcYJkKWlZYfzgVxdXTFv3jwsX74cUinnWBMREVHPo3ECFB0djX//+9+YN28egoODAQBHjx5FTEwMXn/9dRQWFmLt2rWQy+V47bXXujxgIiIiolulcQIUExODdevWYcaMGaqyqVOnwt/fH19++SViY2Ph7u6Ot99+mwkQERER9Ugaj1HFxcW1eebX8OHDER8fDwC47bbb1A4xJSIiIupJNE6A3NzcsGHDhlblGzZsgJubGwCguLgYVlZWtx4dERERkRZoPAS2du1aPPzww/j9998xevRoAEBCQgLOnj2LHTt2AACOHTuGmTNndm2kRERERF3kps4CS09Px5dffonz588DAHx9ffH000/D09Ozq+PTCZ4FRkRE1Pto8v7Nw1DbwASIiIio99Hk/VvjITAAKC0txdGjR1FQUAClUql2be7cuTfTJBEREVG30TgB+uWXX/Doo4+isrIS5ubmapsiSiQSJkBERETU42m8Cmzx4sV4/PHHUVlZidLSUpSUlKg+eBI8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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# get results for variational angles\n", + "gamma = result_angle[:DEPTH]\n", + "beta = result_angle[DEPTH:]\n", + "# get array [1, 2, ..., p]\n", + "pa = np.arange(1, DEPTH + 1)\n", + "\n", + "plt.figure(2)\n", + "plt.plot(pa, gamma / np.pi, \"-o\", label=\"gamma\")\n", + "plt.plot(pa, beta / np.pi, \"-s\", label=\"beta\")\n", + "plt.xlabel(\"circuit depth (layer) p\")\n", + "plt.ylabel(\"optimal angles [pi]\")\n", + "plt.xticks(pa)\n", + "plt.legend(title=\"Variational QAOA angles:\", loc=\"upper left\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Minimal energy found with QAOA: -6.486032631497276\n" + ] + }, + { + "data": { + "image/png": "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GdtxiIiI3JBbT4UFf3+EPPvMmI8T/KuNDAJEROS13HplABjcsOjyTx+CoawMkBx71HBYSiXUCQmI2P8X6z0HRERE3sbtwwAwuCNhx/fvhdTW5rxAoFRCCA5GxP6/QDVrlnPOSURE5IHc+jLBNcrISEz58/tQRkWNar+Cv59QCSEkBFP27mEQICIir+cRYQAAVDNnImL/X+CryRl8YRTbCvukLEbE/+2HOi7OSdURERF5Lo+4THA9WZbRv+d9dD/7HOSensH9BIZ7/FChAGQZioAABD/5awSu/kc+RkhERHSVx4WBa+SBAQzs/wi9b70N06lTgy8Kwt83G7JYrCFBNX8+gtashv/990EIDHRRxURERO7JY8PA9Sw6HUx1dTD97TQsOt3gKkBgINQJCfBZkAQhNNTVJRIREbmtCREGiIiIaOR44ZyIiMjLMQwQERF5OYYBIiIiL8cwQERE5OUYBoiIiLwcwwAREZGXYxggIiLycgwDREREXo5hgIiIyMsxDBAREXk5hgEiIiIvxzBARETk5RgGiIiIvBzDABERkZdjGCAiIvJyDANERERejmGAiIjIyzEMEBEReTmGASIiIi/HMEBEROTlGAaIiIi8HMMAERGRl2MYICIi8nIMA0RERF6OYYCIiMjLMQwQERF5uf8Hywao1f4RDfoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# visualize solution\n", + "colorlist = tracker[\"optimal_bitstring\"]\n", + "colorlist[colorlist == -1] = 0\n", + "\n", + "# plot_colored_graph(J, N, colorlist, pos)\n", + "plot_colored_graph_simple(G, colorlist, pos)\n", + "print(\"Minimal energy found with QAOA:\", tracker[\"optimal_energy\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Classical solution: {'s0': -1, 's1': 1, 's2': -1, 's3': -1, 's4': 1, 's5': -1, 's6': 1, 's7': 1, 's8': -1, 's9': -1}\n", + "Minimal energy found classically: -6.486032631497276\n" + ] + }, + { + "data": { + "image/png": "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GdtxiIiI3JBbT4UFf3+EPPvMmI8T/KuNDAJEROS13HplABjcsOjyTx+CoawMkBx71HBYSiXUCQmI2P8X6z0HRERE3sbtwwAwuCNhx/fvhdTW5rxAoFRCCA5GxP6/QDVrlnPOSURE5IHc+jLBNcrISEz58/tQRkWNar+Cv59QCSEkBFP27mEQICIir+cRYQAAVDNnImL/X+CryRl8YRTbCvukLEbE/+2HOi7OSdURERF5Lo+4THA9WZbRv+d9dD/7HOSensH9BIZ7/FChAGQZioAABD/5awSu/kc+RkhERHSVx4WBa+SBAQzs/wi9b70N06lTgy8Kwt83G7JYrCFBNX8+gtashv/990EIDHRRxURERO7JY8PA9Sw6HUx1dTD97TQsOt3gKkBgINQJCfBZkAQhNNTVJRIREbmtCREGiIiIaOR44ZyIiMjLMQwQERF5OYYBIiIiL8cwQERE5OUYBoiIiLwcwwAREZGXYxggIiLycgwDREREXo5hgIiIyMsxDBAREXk5hgEiIiIvxzBARETk5RgGiIiIvBzDABERkZdjGCAiIvJyDANERERejmGAiIjIyzEMEBEReTmGASIiIi/HMEBEROTlGAaIiIi8HMMAERGRl2MYICIi8nIMA0RERF6OYYCIiMjLMQwQERF5uf8Hywao1f4RDfoAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# validate quantum results with classical algorithm\n", + "solution, energy_min, colors_classical = solve_classical_ising(J, n_qubits, pos)\n", + "# plot classical solution\n", + "plot_colored_graph_simple(G, colors_classical, pos)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that QAOA may arrive at a different solution than our classical benchmark code. \n", + "First of all, the classical optimization routine may get stuck in a local rather than global optimum. \n", + "To avoid this, more sophisticated optimization strategies may be employed (as proposed for example in Ref.[4]), going beyond the scope of this introductory notebook tutorial. \n", + "Secondly, even if QAOA arrives at the same classical energy as our classical approach, the coloring may differ since the solution space may be degenerate for the specific example shown here (this means, two different classical bitstrings have the same energy).\n", + "At minimum, you may find an inverted coloring (by swapping red and blue colors), because of the underlying $\\mathbb{Z}_{2}$ symmetry. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## SUMMARY" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook we have gone through an end-to-end demo on QAOA and its implementation on Amazon Braket. \n", + "We have built modular core building blocks that may easily adapted to other problems. \n", + "The QAOA routine is tailored towards solving combinatorial optimization problems such as _Maximum Cut_ [4] and arguably one of the most prominent examples of the emerging class of hybrid, variational algorithms and still very much a field of active research today. \n", + "For example, as we increase the circuit depth of QAOA, the classical optimization step becomes increasingly difficult (because of the curse of dimensionality as well known in classical machine learning) and may easily get stuck in local sub-optimal solutions. \n", + "To address this issue some heuristics have already been developed, for example in Ref.[4], but further improvements will arguably be necessary to fully unlock the potential of this approach. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## REFERENCES" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[1] E. Farhi, J. Goldstone, and S. Gutmann, \"A Quantum Approximate Optimization Algorithm\", arXiv: 1411.4028 (2014).\n", + "\n", + "[2] Y. Cao, J. Romero, J. P. Olson, M. Degroote, P. D. Johnson, M. Kieferova, I. D. Kivlichan, T. Menke, B. Peropadre, N. P. Sawaya, et al., \"Quantum Chemistry in the Age of Quantum Computing\", Chemical reviews 119, 10856 (2019).\n", + "\n", + "[3] A. Smith, M. Kim, F. Pollmann, and J. Knolle, \"Simulating quantum many-body dynamics on a current digital quantum computer\", npj Quantum Information 5, 1 (2019).\n", + "\n", + "[4] L. Zhou, S.-T. Wang, S. Choi, H. Pichler, and M. D. Lukin, \"Quantum Approximate Optimization Algorithm: Performance, Mechanism,and Implementation on Near-Term Devices\", arXiv: 1812.01041 (2018). \n", + "\n", + "[5] F. Glover, G. Kochenberger, \"A Tutorial on Formulating and Using QUBO Models\", arXiv:1811.11538 (2018).\n", + "\n", + "[6] P. Vikstal, M. Groenkvist, M. Svensson, M. Andersson, G. Johansson, and G. Ferrini, \"Applying the Quantum Approximate Optimization Algorithm to the Tail Assignment Problem\", arXiv:1912.10499 (2019). \n", + "\n", + "[7] L. Li, M. Fan, M. Coram, P. Riley, and S. Leichenauer, \"Quantum optimization with a novel gibbs objective function and ansatz architecture search\", arXiv:1909.07621 (2019). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## APPENDIX" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### APPENDIX: Example for Ising Matrix Syntax" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this appendix we provide a small code example to showcase how we obtain all edges with corresponding weights. " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ising matrix:\n", + " [[0 1 0]\n", + " [0 0 3]\n", + " [0 0 0]]\n", + "Edges: [(0, 1), (1, 2)]\n", + "Interaction strength: 1\n", + "Interaction strength: 3\n", + "All interactions: [1 3]\n" + ] + } + ], + "source": [ + "# example Ising matrix with edges between qubit 0 and qubit 1 (weight=1) and qubit 1 and qubit 2 (weight=3)\n", + "ising = np.array([[0, 1, 0], [0, 0, 3], [0, 0, 0]])\n", + "print(\"Ising matrix:\\n\", ising)\n", + "\n", + "# get all non-zero entries (edges) from Ising matrix\n", + "idx = ising.nonzero()\n", + "edges = list(zip(idx[0], idx[1]))\n", + "print(\"Edges:\", edges)\n", + "\n", + "# for every edge print interaction strength\n", + "for qubit_pair in edges:\n", + " # get interaction strength\n", + " int_strength = ising[qubit_pair[0], qubit_pair[1]]\n", + " print(\"Interaction strength:\", int_strength)\n", + "\n", + "# get all non-zero entries from Ising, with proper order\n", + "interactions = np.array([ising[q[0], q[1]] for q in edges])\n", + "print(\"All interactions:\", interactions)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Task Summary\n", + "{}\n", + "Estimated cost to run this example with SV1: 0 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(t.quantum_tasks_statistics())\n", + "print(\n", + " f\"Estimated cost to run this example with SV1: {t.qpu_tasks_cost() + t.simulator_tasks_cost()} USD\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.9" + }, + "vscode": { + "interpreter": { + "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/hybrid_quantum_algorithms/QAOA/utils_classical.py b/examples/hybrid_quantum_algorithms/QAOA/utils_classical.py index 4e7ee9329..26b0b535f 100644 --- a/examples/hybrid_quantum_algorithms/QAOA/utils_classical.py +++ b/examples/hybrid_quantum_algorithms/QAOA/utils_classical.py @@ -147,7 +147,7 @@ def solve_classical_ising(J, N, pos): """ # define and build classical Ising - model, linear, quad, offset = build_classical_ising(J, N) + _model, linear, quad, _offset = build_classical_ising(J, N) # Solve classical Ising model solution = solve_ising(linear, quad) diff --git a/examples/hybrid_quantum_algorithms/QAOA/utils_qaoa.py b/examples/hybrid_quantum_algorithms/QAOA/utils_qaoa.py index fbdc6cf27..6e83af89b 100644 --- a/examples/hybrid_quantum_algorithms/QAOA/utils_qaoa.py +++ b/examples/hybrid_quantum_algorithms/QAOA/utils_qaoa.py @@ -1,11 +1,12 @@ # IMPORTS import numpy as np +from scipy.optimize import minimize + from braket.aws import AwsDevice from braket.circuits import Circuit from braket.circuits.circuit import subroutine from braket.devices import LocalSimulator from braket.parametric import FreeParameter -from scipy.optimize import minimize # function to implement ZZ gate using CNOT gates @@ -109,7 +110,7 @@ def objective_function(params, qaoa_circuit, ising, device, n_shots, tracker, ve # create parameter dict params_dict = {str(fp): p for fp, p in zip(qaoa_circuit.parameters, params)} - + # classically simulate the circuit # set the parameter values using the inputs argument # execute the correct device.run call depending on whether the backend is local or cloud based @@ -161,9 +162,7 @@ def objective_function(params, qaoa_circuit, ising, device, n_shots, tracker, ve # The function to execute the training: run classical minimization. -def train( - device, options, p, ising, n_qubits, n_shots, opt_method, tracker, verbose=True -): +def train(device, options, p, ising, n_qubits, n_shots, opt_method, tracker, verbose=True): """ function to run QAOA algorithm for given, fixed circuit depth p """ @@ -187,10 +186,10 @@ def train( # set bounds for search space bnds_gamma = [(0, 2 * np.pi) for _ in range(int(len(params0) / 2))] bnds_beta = [(0, np.pi) for _ in range(int(len(params0) / 2))] - bnds = bnds_gamma + bnds_beta + bnds_gamma + bnds_beta tracker["params"].append(params0) - + gamma_params = [FreeParameter(f"gamma_{i}") for i in range(p)] beta_params = [FreeParameter(f"beta_{i}") for i in range(p)] params = gamma_params + beta_params diff --git a/examples/hybrid_quantum_algorithms/VQE_Chemistry/VQE_chemistry_braket.ipynb b/examples/hybrid_quantum_algorithms/VQE_Chemistry/VQE_chemistry_braket.ipynb index e1f45b84d..5769792de 100644 --- a/examples/hybrid_quantum_algorithms/VQE_Chemistry/VQE_chemistry_braket.ipynb +++ b/examples/hybrid_quantum_algorithms/VQE_Chemistry/VQE_chemistry_braket.ipynb @@ -312,7 +312,7 @@ "outputs": [], "source": [ "# create a directory named \"data\" to store intermediate classical computation results from OpenFermion\n", - "!mkdir -p \"data\"\n" + "!mkdir -p \"data\"" ] }, { @@ -324,11 +324,13 @@ "# import required libraries\n", "import os\n", "import time\n", + "\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "from openfermion import MolecularData\n", "from openfermion.transforms import get_fermion_operator, jordan_wigner\n", "from openfermionpyscf import run_pyscf\n", + "\n", "from braket.circuits import Circuit, observables\n", "from braket.devices import LocalSimulator\n", "from braket.parametric import FreeParameter" @@ -369,7 +371,7 @@ "# See https://en.wikipedia.org/wiki/Multiplicity_(chemistry) for more details\n", "spin_mult = 1\n", "# use the minimal basis set (STO-3G)\n", - "basis_set = 'sto-3g'\n", + "basis_set = \"sto-3g\"\n", "# number of active electrons and orbitals to consider\n", "# For H2 as we're consider all electrons and orbitals as active for STO-3G\n", "occ_ind = act_ind = None\n", @@ -439,23 +441,35 @@ "# Store molecular config data and Hamiltonian for each bond length\n", "for rr in bond_lengths:\n", " # round to 2 digits to get a reasonable-length number for bond-length\n", - " r = round(rr,2)\n", + " r = round(rr, 2)\n", " print(f\"INFO: Computing Hamiltonian for bond-length {r} A...\")\n", - " geom = [('H', (0., 0., -r/2.)), ('H', (0., 0., r/2.))]\n", + " geom = [(\"H\", (0.0, 0.0, -r / 2.0)), (\"H\", (0.0, 0.0, r / 2.0))]\n", " # Make sure a directory named 'data' exists in the current folder,\n", " # else this statement will throw an error!\n", " h2_molecule = MolecularData(\n", - " geometry=geom, basis=basis_set, multiplicity=spin_mult,\n", - " description='bondlength_'+str(r)+'A', filename=\"\",\n", - " data_directory=os.getcwd()+'/data')\n", + " geometry=geom,\n", + " basis=basis_set,\n", + " multiplicity=spin_mult,\n", + " description=\"bondlength_\" + str(r) + \"A\",\n", + " filename=\"\",\n", + " data_directory=os.getcwd() + \"/data\",\n", + " )\n", " # Run PySCF to get molecular integrals, HF and FCI energies\n", - " h2_molecule = run_pyscf(molecule=h2_molecule, run_scf=True,\n", - " run_mp2=False, run_cisd=False,\n", - " run_ccsd=False, run_fci=True, verbose=False)\n", + " h2_molecule = run_pyscf(\n", + " molecule=h2_molecule,\n", + " run_scf=True,\n", + " run_mp2=False,\n", + " run_cisd=False,\n", + " run_ccsd=False,\n", + " run_fci=True,\n", + " verbose=False,\n", + " )\n", " # Convert electronic Hamiltonian to qubit operator using JW encoding\n", - " h2_qubit_hamiltonian = jordan_wigner(get_fermion_operator(\n", - " h2_molecule.get_molecular_hamiltonian(occupied_indices=occ_ind,\n", - " active_indices=act_ind)))\n", + " h2_qubit_hamiltonian = jordan_wigner(\n", + " get_fermion_operator(\n", + " h2_molecule.get_molecular_hamiltonian(occupied_indices=occ_ind, active_indices=act_ind)\n", + " )\n", + " )\n", " # store molecular data and qubit operator for this config in an ordered list\n", " mol_configs[r] = [h2_molecule, h2_qubit_hamiltonian]\n", "print(f\"INFO: Computed Hamiltonians for {len(mol_configs)} bond-lengths.\")" @@ -500,20 +514,20 @@ } ], "source": [ - "# Construct circuit for UCCSD ansatz parameterized by VQE parameter per McArdle et al. \n", + "# Construct circuit for UCCSD ansatz parameterized by VQE parameter per McArdle et al.\n", "a_theta = FreeParameter(\"a_theta\")\n", "# Initialize HF state |0011>\n", "ansatz_uccsd = Circuit().x(2).x(3)\n", "# Perform initial rotations to measure in Y & X bases\n", - "ansatz_uccsd.rx(3,np.pi/2.).h(range(3))\n", + "ansatz_uccsd.rx(3, np.pi / 2.0).h(range(3))\n", "# Entangle with CNOTs\n", - "ansatz_uccsd.cnot(3,2).cnot(2,1).cnot(1,0)\n", + "ansatz_uccsd.cnot(3, 2).cnot(2, 1).cnot(1, 0)\n", "# Perform the rotation in Z-basis\n", - "ansatz_uccsd.rz(0,a_theta)\n", + "ansatz_uccsd.rz(0, a_theta)\n", "# Uncompute the rotations\n", - "ansatz_uccsd.cnot(1,0).cnot(2,1).cnot(3,2)\n", + "ansatz_uccsd.cnot(1, 0).cnot(2, 1).cnot(3, 2)\n", "ansatz_uccsd.h(range(3))\n", - "ansatz_uccsd.rx(3,-np.pi/2.)\n", + "ansatz_uccsd.rx(3, -np.pi / 2.0)\n", "\n", "# initialize quantum device to run VQE over\n", "local_sim = LocalSimulator()\n", @@ -525,7 +539,11 @@ "# print(local_sim.run(ansatz_uccsd(0)).result().state_vector)\n", "print(local_sim.run(ansatz_uccsd(0), shots=n_shots).result().measurement_probabilities)\n", "# We can also fix the value of a_theta by supplying the inputs argument to run\n", - "print(local_sim.run(ansatz_uccsd, shots=n_shots, inputs={'a_theta': 0.0}).result().measurement_probabilities)" + "print(\n", + " local_sim.run(ansatz_uccsd, shots=n_shots, inputs={\"a_theta\": 0.0})\n", + " .result()\n", + " .measurement_probabilities\n", + ")" ] }, { @@ -542,7 +560,7 @@ "outputs": [], "source": [ "def calculate_observable_expectation(a_indices_gates, a_ckt, a_dev, a_shots):\n", - " \"\"\" Calculates the expectation value of the given observable\n", + " \"\"\"Calculates the expectation value of the given observable\n", " Parameters:\n", " a_indices_gates [sequence(tuple(int, str))]: List of tuple of qubit index & observable\n", " a_ckt [Circuit]: Braket circuit to which measurement gates are to be added\n", @@ -570,8 +588,9 @@ " # compute expectation value\n", " return a_dev.run(measuring_ckt, shots=a_shots).result().values[0]\n", "\n", + "\n", "def H_exp(a_qH, a_ckt, a_dev, a_shots=n_shots):\n", - " \"\"\" Get expectation value of Hamiltonian for a given circuit result.\n", + " \"\"\"Get expectation value of Hamiltonian for a given circuit result.\n", " Parameters:\n", " a_qH [OpenFermion QubitHamiltonian.terms]: Dictionary of OpenFermion QubitHamiltonian operator terms\n", " a_ckt [Braket Circuit]: Circuit to create the final state\n", @@ -581,7 +600,7 @@ " H_e [float]: Expectation value of a_qH for a_ket\n", " \"\"\"\n", " # initialize expectation value of Hamiltonian\n", - " H_e = 0.\n", + " H_e = 0.0\n", " # loop over each term in qubit operator\n", " for term in a_qH:\n", " # extract the real-valued coefficient for this term\n", @@ -675,7 +694,7 @@ " # initialize min_energy for this config\n", " mol_configs[r].append(np.inf)\n", " # Loop over all VQE parameter values\n", - " for theta in np.linspace(start=-np.pi,stop=np.pi,num=n_theta,endpoint=False):\n", + " for theta in np.linspace(start=-np.pi, stop=np.pi, num=n_theta, endpoint=False):\n", " # get expectation value of this config's Hamiltonian for this parameter value\n", " exp_H_theta = H_exp(mol_configs[r][1].terms, ansatz_uccsd(theta), local_sim)\n", " # if this expectation value is less than min found so far, update it\n", @@ -710,17 +729,17 @@ ], "source": [ "# Plot ground-state energy for each configuration vs bond length\n", - "plt.figure(figsize=(8,6), dpi=700)\n", - "plt.plot(list(mol_configs.keys()), [val[0].hf_energy for val in mol_configs.values()], label='HF')\n", - "plt.plot(list(mol_configs.keys()), [val[0].fci_energy for val in mol_configs.values()], label='FCI')\n", - "plt.plot(list(mol_configs.keys()), [val[2] for val in mol_configs.values()], 'x-', label='VQE')\n", + "plt.figure(figsize=(8, 6), dpi=700)\n", + "plt.plot(list(mol_configs.keys()), [val[0].hf_energy for val in mol_configs.values()], label=\"HF\")\n", + "plt.plot(list(mol_configs.keys()), [val[0].fci_energy for val in mol_configs.values()], label=\"FCI\")\n", + "plt.plot(list(mol_configs.keys()), [val[2] for val in mol_configs.values()], \"x-\", label=\"VQE\")\n", "plt.grid()\n", - "plt.xlabel('Bond length of H2 [A]')\n", - "plt.ylabel('Ground-state energy for H2 [Ha]')\n", + "plt.xlabel(\"Bond length of H2 [A]\")\n", + "plt.ylabel(\"Ground-state energy for H2 [Ha]\")\n", "plt.legend()\n", - "plt.title('VQE computed ground-state energy of H2 vs bond-length for STO-3G basis vs HF and FCI')\n", - "plt.savefig('H2_PES_byVQE.png')\n", - "run_time = time.time()-run_time\n", + "plt.title(\"VQE computed ground-state energy of H2 vs bond-length for STO-3G basis vs HF and FCI\")\n", + "plt.savefig(\"H2_PES_byVQE.png\")\n", + "run_time = time.time() - run_time\n", "print(f\"Total running time: {run_time:.2f} s\")" ] }, diff --git a/examples/hybrid_quantum_algorithms/VQE_Transverse_Ising/VQE_Transverse_Ising_Model.ipynb b/examples/hybrid_quantum_algorithms/VQE_Transverse_Ising/VQE_Transverse_Ising_Model.ipynb index 9eabe6d21..5a7989887 100644 --- a/examples/hybrid_quantum_algorithms/VQE_Transverse_Ising/VQE_Transverse_Ising_Model.ipynb +++ b/examples/hybrid_quantum_algorithms/VQE_Transverse_Ising/VQE_Transverse_Ising_Model.ipynb @@ -7,6 +7,7 @@ "outputs": [], "source": [ "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -125,11 +126,13 @@ "outputs": [], "source": [ "# general imports\n", - "import numpy as np\n", - "from scipy.optimize import minimize\n", - "import matplotlib.pyplot as plt\n", "import time\n", "from datetime import datetime\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from scipy.optimize import minimize\n", + "\n", "# magic word for producing visualizations in notebook\n", "%matplotlib inline" ] @@ -217,12 +220,12 @@ " # set number of qubits\n", " ising = np.zeros((n_qubits, n_qubits))\n", " # set nearest-neighbour interactions to nonzero values only\n", - " for ii in range(0, n_qubits-1):\n", - " ising[ii][ii+1] = -1\n", + " for ii in range(0, n_qubits - 1):\n", + " ising[ii][ii + 1] = -1\n", " # add periodic boundary conditions\n", - " ising[0][n_qubits-1] = -1\n", - " print('Ising matrix:\\n', ising)\n", - " \n", + " ising[0][n_qubits - 1] = -1\n", + " print(\"Ising matrix:\\n\", ising)\n", + "\n", " return ising" ] }, @@ -236,12 +239,12 @@ "def circuit(params, n_qubits):\n", " \"\"\"\n", " function to return full VQE circuit ansatz\n", - " input: parameter list with three parameters \n", + " input: parameter list with three parameters\n", " \"\"\"\n", "\n", " # instantiate circuit object\n", " circuit = Circuit()\n", - " \n", + "\n", " # add Hadamard gate on first qubit\n", " circuit.rz(0, params[0]).ry(0, params[1])\n", "\n", @@ -263,50 +266,50 @@ " objective function takes a list of variational parameters as input,\n", " and returns the cost associated with those parameters\n", " \"\"\"\n", - " \n", + "\n", " global CYCLE\n", " CYCLE += 1\n", - " \n", + "\n", " if verbose:\n", - " print('==================================' * 2)\n", - " print('Calling the quantum circuit. Cycle:', CYCLE)\n", - " \n", + " print(\"==================================\" * 2)\n", + " print(\"Calling the quantum circuit. Cycle:\", CYCLE)\n", + "\n", " # obtain a quantum circuit instance from the parameters\n", " vqe_circuit = circuit(params, n_qubits)\n", " circuit_zz = Circuit(vqe_circuit).sample(observables.Z())\n", - " \n", + "\n", " # run the circuit on appropriate device\n", " task_zz = device.run(circuit_zz, shots=n_shots)\n", "\n", " # Hb term: construct the circuit for measuring in the X-basis\n", " circuit_b = Circuit(vqe_circuit).sample(observables.X())\n", - " \n", + "\n", " # run the circuit (with H rotation at end)\n", " task_b = device.run(circuit_b, shots=n_shots)\n", "\n", " # Collect results from devices (wait for results, if necessary)\n", " result_zz = task_zz.result()\n", " result_b = task_b.result()\n", - " \n", + "\n", " # Compute Hzz term\n", " # Hzz term: get approx energy expectation value (factor 1/4 for Pauli vs spin 1/2)\n", " expectations_zz = np.array(result_zz.values[0])\n", " energy_expect_zz = 0.25 * np.einsum(\"ik,ij,jk\", expectations_zz, J, expectations_zz) / n_shots\n", - " \n", + "\n", " # Compute Hb term\n", " # Hb term: get approx energy expectation value (factor 1/2 for Pauli vs spin 1/2)\n", " energy_expect_b = -1 * b_field / 2 * np.array(result_b.values[0]).sum() / n_shots\n", - " \n", + "\n", " # get total energy expectation value\n", " energy_expect = energy_expect_zz + energy_expect_b\n", - " \n", + "\n", " # per site\n", " energy_expect_ind = energy_expect / n_qubits\n", - " \n", + "\n", " # print energy expectation value\n", " if verbose:\n", - " print('Energy expectation value:', energy_expect)\n", - " print('Energy expectation value (per particle):', energy_expect_ind)\n", + " print(\"Energy expectation value:\", energy_expect)\n", + " print(\"Energy expectation value (per particle):\", energy_expect_ind)\n", "\n", " return energy_expect\n", "\n", @@ -316,35 +319,34 @@ " \"\"\"\n", " function to run VQE algorithm with several random seeds for initialization\n", " \"\"\"\n", - " print('Starting the training.')\n", - " \n", + " print(\"Starting the training.\")\n", + "\n", " if verbose:\n", - " print('==================================' * 3)\n", - " print('Running VQE OPTIMIZATION.')\n", - " \n", + " print(\"==================================\" * 3)\n", + " print(\"Running VQE OPTIMIZATION.\")\n", + "\n", " # initialize vectors for results per random seed\n", " cost_energy = []\n", " angles = []\n", - " \n", + "\n", " # optimize for different random initializations: avoid local optima\n", " for ii in range(n_initial):\n", - " \n", - " #print counter\n", + " # print counter\n", " if verbose:\n", - " run_init = ii+1\n", - " print('Running VQE OPTIMIZATION for random seed NUMBER', run_init)\n", - " \n", + " run_init = ii + 1\n", + " print(\"Running VQE OPTIMIZATION for random seed NUMBER\", run_init)\n", + "\n", " # randomly initialize variational parameters within appropriate bounds\n", " params0 = np.random.uniform(0, 2 * np.pi, 3).tolist()\n", " # set bounds for search space\n", - " bnds = [(0, 2 * np.pi) for _ in range(int(len(params0)))]\n", "\n", " # run classical optimization\n", " result = minimize(\n", " objective_function,\n", " params0,\n", - " args=(J, b_field, n_qubits, n_shots, verbose), \n", - " options=options, method='COBYLA',\n", + " args=(J, b_field, n_qubits, n_shots, verbose),\n", + " options=options,\n", + " method=\"COBYLA\",\n", " # bounds=bnds\n", " )\n", "\n", @@ -354,21 +356,21 @@ " result_angle = result.x\n", " angles.append(result_angle)\n", " if verbose:\n", - " print('Optimal avg energy:', result_energy)\n", - " print('Optimal angles:', result_angle)\n", - " \n", - " # reset cycle count \n", + " print(\"Optimal avg energy:\", result_energy)\n", + " print(\"Optimal angles:\", result_angle)\n", + "\n", + " # reset cycle count\n", " global CYCLE\n", " CYCLE = 0\n", - " \n", + "\n", " # store energy minimum (over different initial configurations)\n", " energy_min = np.min(cost_energy)\n", " optim_angles = angles[np.argmin(cost_energy)]\n", " if verbose:\n", - " print('Energy per initial seeds:', cost_energy)\n", - " print('Minimal energy:', energy_min)\n", - " print('Optimal variational angles:', optim_angles)\n", - " \n", + " print(\"Energy per initial seeds:\", cost_energy)\n", + " print(\"Minimal energy:\", energy_min)\n", + " print(\"Optimal variational angles:\", optim_angles)\n", + "\n", " return energy_min" ] }, @@ -473,12 +475,12 @@ "\n", "vqe_circuit = circuit(params, N)\n", "\n", - "print('1. Printing VQE test circuit:')\n", + "print(\"1. Printing VQE test circuit:\")\n", "print(vqe_circuit)\n", "\n", "# Hb term: construct the circuit for measuring in the X-basis\n", - "print('')\n", - "print('2. Apply Hadamard to measure in x-basis:')\n", + "print(\"\")\n", + "print(\"2. Apply Hadamard to measure in x-basis:\")\n", "print(Circuit(vqe_circuit).h(range(0, N)))" ] }, @@ -552,9 +554,9 @@ "source": [ "# set up the problem\n", "SHOTS = 1_000\n", - "N = 4 # number of qubits\n", - "n_initial = 2 # number of random seeds to explore optimization landscape\n", - "verbose = False # control amount of print output\n", + "N = 4 # number of qubits\n", + "n_initial = 2 # number of random seeds to explore optimization landscape\n", + "verbose = False # control amount of print output\n", "\n", "# set counters\n", "CYCLE = 0\n", @@ -577,29 +579,23 @@ "\n", "for bb in xvalues:\n", " b_field = bb\n", - " print('Strength of magnetic field:', b_field)\n", + " print(\"Strength of magnetic field:\", b_field)\n", " energy_min = train(\n", - " J,\n", - " b_field,\n", - " options=options,\n", - " n_qubits=N,\n", - " n_shots=SHOTS,\n", - " n_initial=n_initial,\n", - " verbose=verbose\n", + " J, b_field, options=options, n_qubits=N, n_shots=SHOTS, n_initial=n_initial, verbose=verbose\n", " )\n", " results.append(energy_min)\n", - " results_site.append(energy_min/N)\n", - " \n", + " results_site.append(energy_min / N)\n", + "\n", " # reset counters\n", " CYCLE = 0\n", "\n", "end = time.time()\n", "# print execution time\n", - "print('Code execution time [sec]:', end - start)\n", + "print(\"Code execution time [sec]:\", end - start)\n", "\n", "# print optimized results\n", - "print('Optimal energies:', results)\n", - "print('Optimal energies (per site):', results_site)" + "print(\"Optimal energies:\", results)\n", + "print(\"Optimal energies (per site):\", results_site)" ] }, { @@ -620,9 +616,9 @@ ], "source": [ "# plot the VQE results for the energy per site\n", - "plt.plot(xvalues, results_site, 'm--o')\n", - "plt.xlabel('transverse field $B [J]$')\n", - "plt.ylabel('groundstate energy per site $E_{0}/N [J]$')\n", + "plt.plot(xvalues, results_site, \"m--o\")\n", + "plt.xlabel(\"transverse field $B [J]$\")\n", + "plt.ylabel(\"groundstate energy per site $E_{0}/N [J]$\")\n", "plt.show()" ] }, @@ -658,18 +654,18 @@ " Here set J=1 (units of energy)\n", " \"\"\"\n", " # lamba_ratio (setting J=1): compare thesis\n", - " ll = 1/(2*B)\n", - " \n", + " ll = 1 / (2 * B)\n", + "\n", " # set energy\n", " gs_energy = 0\n", - " \n", + "\n", " # numerical integration\n", " step_size = 0.0001\n", " k_values = np.arange(0, np.pi, step_size)\n", - " integration_values = [step_size*np.sqrt(1 + ll**2 + 2 * ll * np.cos(kk)) for kk in k_values]\n", + " integration_values = [step_size * np.sqrt(1 + ll**2 + 2 * ll * np.cos(kk)) for kk in k_values]\n", " integral = np.sum(integration_values)\n", - " gs_energy = 1*integral/(4*np.pi*ll)\n", - " \n", + " gs_energy = 1 * integral / (4 * np.pi * ll)\n", + "\n", " return gs_energy" ] }, @@ -692,20 +688,20 @@ "source": [ "# plot exact gs energy of TIM vs VQE results\n", "x = np.arange(0.01, 2.2, 0.2)\n", - "y = [-1*num_integrate_gs(xx) for xx in x]\n", + "y = [-1 * num_integrate_gs(xx) for xx in x]\n", "# plot exact results\n", - "plt.plot(x, y, 'b--s', label='exact')\n", + "plt.plot(x, y, \"b--s\", label=\"exact\")\n", "# plot vqe results\n", - "plt.plot(xvalues, results_site, 'm--o', label='VQE')\n", - "plt.xlabel('magnetic field $B [J]$')\n", - "plt.ylabel('groundstate energy $E_{0}/N [J]$')\n", - "plt.tight_layout();\n", + "plt.plot(xvalues, results_site, \"m--o\", label=\"VQE\")\n", + "plt.xlabel(\"magnetic field $B [J]$\")\n", + "plt.ylabel(\"groundstate energy $E_{0}/N [J]$\")\n", + "plt.tight_layout()\n", "plt.legend()\n", "# save figure\n", "if SAVE_FIG:\n", - " time_now = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')\n", - " filename = 'vqe_tim_gs-energy_'+time_now+'.png'\n", - " plt.savefig(filename, dpi=700);" + " time_now = datetime.strftime(datetime.now(), \"%Y%m%d%H%M%S\")\n", + " filename = \"vqe_tim_gs-energy_\" + time_now + \".png\"\n", + " plt.savefig(filename, dpi=700)" ] }, { diff --git a/examples/pennylane/0_Getting_started/0_Getting_started.ipynb b/examples/pennylane/0_Getting_started/0_Getting_started.ipynb index 0f6617888..3adf55d77 100644 --- a/examples/pennylane/0_Getting_started/0_Getting_started.ipynb +++ b/examples/pennylane/0_Getting_started/0_Getting_started.ipynb @@ -1,830 +1,831 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Combining PennyLane with Amazon Braket" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "What is PennyLane? PennyLane is a Python library for differentiable programming of quantum computers, allowing you to train a quantum computer the same way as a neural network.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "PennyLane integrates with Amazon Braket to add additional features for quantum machine learning and optimization. This introductory tutorial walks you through how to train a quantum circuit using Amazon Braket simulators and PennyLane's automatic differentiation capabilities." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setup" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "PennyLane is already installed on Braket notebook instances. On a local machine, PennyLane can be installed by following [these](https://pennylane.ai/install.html) instructions. It can then be imported with:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:09.404557Z", - "start_time": "2024-02-19T21:42:03.275541Z" - } - }, - "outputs": [], - "source": [ - "import pennylane as qml\n", - "from pennylane import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To use Braket as a backend in PennyLane, we have to create a PennyLane device. Here we will first create a device that uses the local Braket simulator that runs on your local laptop (or on the server that hosts this notebook)." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.351825Z", - "start_time": "2024-02-19T21:42:09.405882Z" - } - }, - "outputs": [], - "source": [ - "wires = 2 # Number of qubits\n", - "\n", - "dev = qml.device(\"braket.local.qubit\", wires=wires)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Below we will also show you how to scale out simulations to the AWS cloud." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Defining a circuit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will choose a simple two-qubit circuit with two controllable rotations and a CNOT gate." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.355051Z", - "start_time": "2024-02-19T21:42:10.352639Z" - } - }, - "outputs": [], - "source": [ - "@qml.qnode(dev)\n", - "def circuit(params):\n", - " qml.RX(params[0], wires=0)\n", - " qml.RY(params[1], wires=1)\n", - " qml.CNOT(wires=[0, 1])\n", - " return qml.expval(qml.PauliZ(1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The ``qml.qnode(dev)`` decorator binds the circuit to the local Braket device. Now, every time that ``circuit()`` is called, the quantum computation defined in the function above will be executed with Braket." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Note PennyLane also supports automatic differentiation with PyTorch and TensorFlow interfaces. The choice of interface can be specified using:\n", - "@qml.qnode(dev, interface=\"<interface>\").\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Evaluating the circuit and accessing its gradient" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's set some values for our controllable parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.359085Z", - "start_time": "2024-02-19T21:42:10.356833Z" - } - }, - "outputs": [], - "source": [ - "params = np.array([0.1, 0.2], requires_grad=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The circuit can be evaluated with these parameters using" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.393070Z", - "start_time": "2024-02-19T21:42:10.359915Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Expectation value of circuit: 0.9751703272018161\n" - ] - } - ], - "source": [ - "print(\"Expectation value of circuit:\", circuit(params))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.397595Z", - "start_time": "2024-02-19T21:42:10.394259Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Drawing of circuit:\n", - "\n", - "0: ──RX(0.10)─╭●─┤ \n", - "1: ──RY(0.20)─╰X─┤ \n" - ] - } - ], - "source": [ - "print(\"Drawing of circuit:\\n\")\n", - "print(qml.draw(circuit)(params))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A crucial element of machine learning and optimization is accessing the gradient of a model with respect to its parameters. This functionality is built into PennyLane:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.400540Z", - "start_time": "2024-02-19T21:42:10.398616Z" - } - }, - "outputs": [], - "source": [ - "dcircuit = qml.grad(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here, ``dcircuit`` is a callable function that evaluates the gradient of the circuit, i.e., its partial derivatives with respect to the controllable parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.523442Z", - "start_time": "2024-02-19T21:42:10.401286Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-0.0978434 , -0.19767681])" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dcircuit(params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Training the circuit" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose we now want to minimize the output of the circuit by updating its parameters. This can be done using gradient-based optimization.\n", - "\n", - "First, an optimizer is fixed:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:10.526039Z", - "start_time": "2024-02-19T21:42:10.524244Z" - } - }, - "outputs": [], - "source": [ - "opt = qml.GradientDescentOptimizer(stepsize=0.1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next step is to run the optimizer for a chosen number of iterations:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:11.062067Z", - "start_time": "2024-02-19T21:42:10.527962Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Minimized circuit output: 0.37261070647126565\n", - "Optimized parameters: [0.4839502 1.13630274]\n" - ] - }, - { - "data": { - "image/png": "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6D5xcXG12o8cORLHjx9HZWVls9XaFDQaDQDAw8Oj3rZ33nknVCoVhg0bhr179zZ3abflwoUL8PHxQUBAACZNmoT09PQ621rz+auoqMC6devwxBNP1LtArDWdvxoZGRnIyckxOD+Ojo4YMmRInd9HoO5zamqflkSj0UAQBLi5uZlsV1JSAj8/P3Tq1An3338/EhMTLVNgI+zbtw+enp7o0aMHnn76aeTl5Zlsb83nMDc3Fz/99BOefPLJetu2xHN46+9CS/4eMtyYKT8/H1qtFl5eXgbbvby8kJOTY3SfnJwco+2rqqqQn5/fbLXeLlEUER0djbvuugshISF1tlOpVPjiiy+wefNmbNmyBYGBgRg2bBgOHDhgwWrNN2DAAHz99df45Zdf8N///hc5OTmIjIxEQUGB0fbWev4AYNu2bbh+/TqmT59eZxtrO39/V/Oda8j3sWa/hu7TUpSVlWHevHl49NFHTS5G2LNnT6xZswY//PADvv32WygUCgwaNAgXLlywYLXmGT16NNavX489e/bgww8/xLFjxzB06FCUl5fXuY81n8O1a9fCxcUF48ePN9muJZ5DY78LLfl72OpWBb9dt/4tWBRFk38zNtbe2PaWZNasWTh16hQOHTpksl1gYCACAwP1zyMiIpCVlYUPPvgAd999d3OX2WCjR4/W/3vv3r0RERGBrl27Yu3atYiOjja6jzWePwBYtWoVRo8eDR8fnzrbWNv5M6ah38fG7iO1yspKTJo0CTqdDitXrjTZduDAgQaDcgcNGoTQ0FAsX74cn3zySXOX2iATJ07U/3tISAj69esHPz8//PTTTyYDgDWeQwBYvXo1HnvssXrHzrTEc2jqd6Elfg955cZM7du3h1wur5Us8/LyaiXQGt7e3kbb29nZoV27ds1W6+14/vnn8cMPP2Dv3r3o1KlTg/cfOHBgi/wbojFt2rRB796966zXGs8fAFy6dAm7d+/GU0891eB9reX81dzl1pDvY81+Dd1HapWVlZgwYQIyMjIQGxtr8qqNMTKZDP3797eK86pSqeDn52eyVms8hwBw8OBBnDt3rlHfS6nPYV2/Cy35e8hwYyYHBweEhYXp70CpERsbi8jISKP7RERE1Gr/66+/ol+/frC3t2+2WhtDFEXMmjULW7ZswZ49exAQENCo90lMTIRKpWri6ppHeXk5UlNT66zXms7f33311Vfw9PTEfffd1+B9reX8BQQEwNvb2+D8VFRUYP/+/XV+H4G6z6mpfaRUE2wuXLiA3bt3NypUi6KIpKQkqzivBQUFyMrKMlmrtZ3DGqtWrUJYWBj69OnT4H2lOof1/S606O9hkw1NbgW+++470d7eXly1apWYkpIizpkzR2zTpo148eJFURRFcd68eeKUKVP07dPT00VnZ2dx7ty5YkpKirhq1SrR3t5e3LRpk1SHUKeZM2eKSqVS3Ldvn6hWq/WP0tJSfZtbj++jjz4St27dKp4/f15MTk4W582bJwIQN2/eLMUh1OvFF18U9+3bJ6anp4u///67eP/994suLi42cf5qaLVasXPnzuKrr75a6zVrO3/FxcViYmKimJiYKAIQly5dKiYmJurvFHrnnXdEpVIpbtmyRTx9+rT4yCOPiCqVSiwqKtK/x5QpUwzuZjx8+LAol8vFd955R0xNTRXfeecd0c7OTvz9998tfnyiaPoYKysrxQceeEDs1KmTmJSUZPC9LC8v17/Hrcf45ptvirt27RLT0tLExMRE8fHHHxft7OzEo0ePtqjjKy4uFl988UXxyJEjYkZGhrh3714xIiJC7Nixo82cwxoajUZ0dnYWY2JijL5HSz2H5vwutNTvIcNNA61YsUL08/MTHRwcxNDQUINbpadNmyYOGTLEoP2+ffvEO++8U3RwcBD9/f3r/J9bagCMPr766it9m1uP79133xW7du0qKhQK0d3dXbzrrrvEn376yfLFm2nixImiSqUS7e3tRR8fH3H8+PHimTNn9K9b8/mr8csvv4gAxHPnztV6zdrOX82t6rc+pk2bJopi9W2oCxcuFL29vUVHR0fx7rvvFk+fPm3wHkOGDNG3r7Fx40YxMDBQtLe3F3v27ClpmDN1jBkZGXV+L/fu3at/j1uPcc6cOWLnzp1FBwcHsUOHDmJUVJR45MgRyx+caPr4SktLxaioKLFDhw6ivb292LlzZ3HatGliZmamwXtY8zms8fnnn4tOTk7i9evXjb5HSz2H5vwutNTvofDnARARERHZBI65ISIiIpvCcENEREQ2heGGiIiIbArDDREREdkUhhsiIiKyKQw3REREZFMYboiIiMimMNwQUavg7++PZcuWSV0GEVkAww0RNbnp06dj3LhxAIB77rkHc+bMsdhnr1mzBm5ubrW2Hzt2DP/85z8tVgcRScdO6gKIiMxRUVEBBweHRu/foUOHJqyGiFoyXrkhomYzffp07N+/Hx9//DEEQYAgCLh48SIAICUlBWPGjEHbtm3h5eWFKVOmID8/X7/vPffcg1mzZiE6Ohrt27fHiBEjAABLly5F79690aZNG/j6+uLZZ59FSUkJAGDfvn14/PHHodFo9J/35ptvAqjdLZWZmYkHH3wQbdu2haurKyZMmIDc3Fz962+++Sb69u2Lb775Bv7+/lAqlZg0aRKKi4v1bTZt2oTevXvDyckJ7dq1w/Dhw3Hjxo1m+q9JROZiuCGiZvPxxx8jIiICTz/9NNRqNdRqNXx9faFWqzFkyBD07dsXx48fx65du5Cbm4sJEyYY7L927VrY2dnh8OHD+PzzzwEAMpkMn3zyCZKTk7F27Vrs2bMHr7zyCgAgMjISy5Ytg6urq/7zXnrppVp1iaKIcePGobCwEPv370dsbCzS0tIwceJEg3ZpaWnYtm0bfvzxR/z444/Yv38/3nnnHQCAWq3GI488gieeeAKpqanYt28fxo8fDy7XRyQ9dksRUbNRKpVwcHCAs7MzvL299dtjYmIQGhqKt99+W79t9erV8PX1xfnz59GjRw8AQLdu3fDee+8ZvOffx+8EBATgrbfewsyZM7Fy5Uo4ODhAqVRCEASDz7vV7t27cerUKWRkZMDX1xcA8M0336BXr144duwY+vfvDwDQ6XRYs2YNXFxcAABTpkzBb7/9hv/85z9Qq9WoqqrC+PHj4efnBwDo3bv3bfzXIqKmwis3RGRxCQkJ2Lt3L9q2bat/9OzZE0D11ZIa/fr1q7Xv3r17MWLECHTs2BEuLi6YOnUqCgoKGtQdlJqaCl9fX32wAYDg4GC4ubkhNTVVv83f318fbABApVIhLy8PANCnTx8MGzYMvXv3xsMPP4z//ve/uHbtmvn/EYio2TDcEJHF6XQ6jB07FklJSQaPCxcu4O6779a3a9OmjcF+ly5dwpgxYxASEoLNmzcjISEBK1asAABUVlaa/fmiKEIQhHq329vbG7wuCAJ0Oh0AQC6XIzY2Fj///DOCg4OxfPlyBAYGIiMjw+w6iKh5MNwQUbNycHCAVqs12BYaGoozZ87A398f3bp1M3jcGmj+7vjx46iqqsKHH36IgQMHokePHrhy5Uq9n3er4OBgZGZmIisrS78tJSUFGo0GQUFBZh+bIAgYNGgQFi1ahMTERDg4OGDr1q1m709EzYPhhoialb+/P44ePYqLFy8iPz8fOp0Ozz33HAoLC/HII48gPj4e6enp+PXXX/HEE0+YDCZdu3ZFVVUVli9fjvT0dHzzzTf47LPPan1eSUkJfvvtN+Tn56O0tLTW+wwfPhx33HEHHnvsMZw4cQLx8fGYOnUqhgwZYrQrzJijR4/i7bffxvHjx5GZmYktW7bg6tWrDQpHRNQ8GG6IqFm99NJLkMvlCA4ORocOHZCZmQkfHx8cPnwYWq0WI0eOREhICF544QUolUrIZHX/sdS3b18sXboU7777LkJCQrB+/XosWbLEoE1kZCRmzJiBiRMnokOHDrUGJAPVV1y2bdsGd3d33H333Rg+fDi6dOmCDRs2mH1crq6uOHDgAMaMGYMePXrgtddew4cffojRo0eb/x+HiJqFIPK+RSIiIrIhvHJDRERENoXhhoiIiGwKww0RERHZFIYbIiIisikMN0RERGRTGG6IiIjIpjDcEBERkU1huCEiIiKbwnBDRERENoXhhoiIiGwKww0RERHZFIYbIiIisin/DwPsQI/yMsJ2AAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "iterations = 20\n", - "\n", - "costs = []\n", - "\n", - "for i in range(iterations):\n", - " params, cost = opt.step_and_cost(circuit, params)\n", - " costs.append(cost)\n", - "\n", - "# Visualize results\n", - "import matplotlib.pyplot as plt\n", - "\n", - "costs.append(circuit(params))\n", - "plt.plot(costs, \"-o\")\n", - "plt.xlabel(\"Iterations\")\n", - "plt.ylabel(\"Cost\")\n", - "\n", - "print(\"Minimized circuit output:\", circuit(params))\n", - "print(\"Optimized parameters:\", params)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "Note The circuit considered here is very simple and can be optimized easily by hand. However, the need for PennyLane's automatic differentiation capabilities becomes apparent as we make the problem more complicated, e.g., with more gates and different types of output measurement. In later demos, we will also see how Braket can be used to parallelize evaluation of the gradient, providing a turbocharger for quantum circuit training in PennyLane.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running circuits on Braket's on-demand simulator, SV1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So far we have used the local Braket simulator. This is a great choice for quick prototyping, but it is not suitable for large circuits with many qubits and does not provide a connection to quantum hardware.\n", - "\n", - "Amazon Braket also provides access to on-demand, high-performance simulators and quantum processing units (QPUs) from different [providers](https://aws.amazon.com/braket/hardware-providers/). These devices can be accessed through PennyLane by changing a single line of code, unlocking the potential for machine learning and optimization on quantum hardware and high performance simulators!\n", - "\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:11.066378Z", - "start_time": "2024-02-19T21:42:11.064297Z" - } - }, - "outputs": [], - "source": [ - "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", - "from braket.tracking import Tracker\n", - "\n", - "braket_tasks_cost = Tracker().start()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each remote Braket device can be selected through its [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html). The supported devices on Braket are listed [here](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html). For now, we will pick the on-demand SV1 simulator.\n", - "\n", - "
\n", - "Caution: Running hybrid algorithms on a QPU can take a long time and incur high usage fees charged to your AWS account.\n", - "
" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "In PennyLane, all remote Braket devices are then accessed through a single PennyLane device named ``braket.aws.qubit``." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:11.437758Z", - "start_time": "2024-02-19T21:42:11.067501Z" - } - }, - "outputs": [], - "source": [ - "from braket.devices import Devices\n", - "dev = qml.device(\"braket.aws.qubit\", device_arn=Devices.Amazon.SV1, wires=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A follow up [tutorial](./1_Parallelized_optimization_of_quantum_circuits.ipynb) shows you how to use the remote device to run multiple circuits in parallel, while the [QAOA tutorial](./2_Graph_optimization_with_QAOA.ipynb) takes a deeper dive into graph optimization, including using SV1 to optimize a 20-node graph." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's execute our circuit on SV1, as well as calculating the gradient:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:18.632136Z", - "start_time": "2024-02-19T21:42:11.439272Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Result of circuit run on SV1: 0.37261070647126565\n", - "Result of gradient calculation on SV1: [-0.19585986 -0.80291741]\n" - ] - } - ], - "source": [ - "@qml.qnode(dev)\n", - "def circuit(params):\n", - " qml.RX(params[0], wires=0)\n", - " qml.RY(params[1], wires=1)\n", - " qml.CNOT(wires=[0, 1])\n", - " return qml.expval(qml.PauliZ(1))\n", - "\n", - "\n", - "dcircuit = qml.grad(circuit)\n", - "\n", - "print(\"Result of circuit run on SV1:\", circuit(params))\n", - "print(\"Result of gradient calculation on SV1:\", dcircuit(params))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - "What's next? Check out the other tutorials in this folder to understand how Braket and PennyLane can be combined to solve a range of problems, from graph optimization to quantum chemistry.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:19.098494Z", - "start_time": "2024-02-19T21:42:18.633487Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Quantum Task Summary\n", - "{<_Amazon.SV1: 'arn:aws:braket:::device/quantum-simulator/amazon/sv1'>: {'shots': 0, 'tasks': {'COMPLETED': 2}, 'execution_duration': datetime.timedelta(microseconds=299000), 'billed_execution_duration': datetime.timedelta(seconds=6)}}\n", - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run this example: 0.008 USD\n" - ] - } - ], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(braket_tasks_cost.quantum_tasks_statistics())\n", - "print(\n", - " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", - ")\n", - "print(\n", - " f\"Estimated cost to run this example: {braket_tasks_cost.qpu_tasks_cost() + braket_tasks_cost.simulator_tasks_cost():.3f} USD\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running on a QPU with Amazon Braket Hybrid Jobs\n", - "\n", - "In this notebook, the classical part of the algorithm was running locally. For longer-running algorithms or those requiring more intensive compute resources, it's recommended to dispatch the algorithm to Amazon Braket Hybrid Jobs, which fully manages the classical infrastructure, allowing you to focus on the algorithm. For example, you can train a larger circuit or increase the number of iterations.\n", - "\n", - "The second benefit of running the algorithm as a hybrid job is that for iterative algorithms that require repeated calls to a QPU, you retain priority for that QPU. Once your quantum tasks are created in the hybrid job, they run ahead of other tasks waiting in the regular quantum task queue. This is because hybrid jobs have a separate queue from standalone tasks, ensuring that only a single hybrid job can run on a QPU at a time. This means your algorithm will not be interrupted by other quantum tasks, so it will run more efficiently and predictably. However, hybrid jobs have a separate queue from standalone tasks, so only a single hybrid job can run on a QPU at a time. For a single quantum circuit or a batch of circuits, it's recommended to create quantum tasks instead of hybrid jobs. Only iterative algorithms benefit from QPU priority queuing.\n", - "\n", - "Note that hybrid jobs have at least a one-minute startup time since they create a containerized environment on Amazon EC2. So for very short workloads, there is likely no need to create a hybrid job.\n", - "\n", - "You can run your local Python code as an Amazon Braket hybrid job by annotating your code with the `@hybrid_job`` decorator, as shown in the following code example. Only Python 3.10 is supported by default. For custom Python versions, you can choose to use a custom container from [Amazon Elastic Container Registry (ECR)](https://aws.amazon.com/ecr/) (see [BYOC](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs-byoc.html)).\n", - "\n", - "\n", - "In the following code, we create a hybrid job for 10 iterations targeting Rigetti Ankaa-2. Since we specified Ankaa-2 as the device, this job will run once Ankaa-2 is available and has no jobs running ahead of it." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:19.442699Z", - "start_time": "2024-02-19T21:42:19.099758Z" - } - }, - "outputs": [], - "source": [ - "from braket.jobs import hybrid_job\n", - "from braket.jobs.metrics import log_metric\n", - "\n", - "device_arn = Devices.Amazon.SV1\n", - "# device_arn = Devices.Rigetti.Ankaa2\n", - "\n", - "\n", - "@hybrid_job(device=device_arn) # set priority QPU\n", - "def qubit_rotation(stepsize=0.1, iterations=5):\n", - " task_tracker = Tracker().start() # track Braket quantum tasks costs\n", - " dev = qml.device(\"braket.aws.qubit\", device_arn=device_arn.value, wires=2, shots=1_000)\n", - "\n", - " params = np.array([0.1, 0.2])\n", - "\n", - " @qml.qnode(dev)\n", - " def circuit(params):\n", - " qml.RX(params[0], wires=0)\n", - " qml.RY(params[1], wires=1)\n", - " qml.CNOT(wires=[0, 1])\n", - " return qml.expval(qml.PauliZ(1))\n", - "\n", - " opt = qml.GradientDescentOptimizer(stepsize)\n", - "\n", - " costs = []\n", - " for i in range(iterations):\n", - " params, cost = opt.step_and_cost(circuit, params)\n", - " costs.append(cost)\n", - "\n", - " # Record the value of the cost function with each iteration\n", - " log_metric(metric_name=\"cost_function\", value=cost, iteration_number=i)\n", - "\n", - " # Additionally, keep track of cost in USD for Braket tasks\n", - " braket_task_cost = float(\n", - " task_tracker.qpu_tasks_cost() + task_tracker.simulator_tasks_cost()\n", - " )\n", - " log_metric(metric_name=\"braket_cost\", value=braket_task_cost, iteration_number=i)\n", - "\n", - " return {\"params\": params, \"costs\": costs, \"braket_tasks_cost\": braket_task_cost}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "How long will it take the hybrid job to run? \n", - "Let's first check if the device is currently available with `AwsDevice(device_arn).is_available()`. " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:19.614223Z", - "start_time": "2024-02-19T21:42:19.443623Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from braket.aws import AwsDevice\n", - "\n", - "AwsDevice(device_arn).is_available" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we check the hybrid job queue depth with `AwsDevice(device_arn).queue_depth().jobs`. " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:19.958746Z", - "start_time": "2024-02-19T21:42:19.615073Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'0'" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "AwsDevice(device_arn).queue_depth().jobs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the device is available and there are no hybrid jobs currently running, then it should take about 5 minutes to complete. \n", - "\n", - "
\n", - "Caution: Running the following cell will only run once the QPU is available. This may take a long time and will result in usage fees charged to your AWS account. Only uncomment the cell if you are comfortable with the potential wait-time and costs. We recommend monitoring the Billing & Cost Management Dashboard on the AWS console and being aware that hybrid jobs involving a large number of qubits can be costly.\n", - "
" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:42:29.440989Z", - "start_time": "2024-02-19T21:42:19.960142Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "AwsQuantumJob('arn':'arn:aws:braket:us-west-2:667256736152:job/qubit-rotation-1708378939963')\n" - ] - } - ], - "source": [ - "job = qubit_rotation(stepsize=0.2, iterations=20)\n", - "print(job)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once the hybrid job has completed, we can retrieve the results with `job.results()`." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:49:52.814493Z", - "start_time": "2024-02-19T21:42:29.442078Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'params': tensor([0.236, 2.649], requires_grad=True), 'costs': [array(0.978), array(0.954), array(0.962), array(0.93), array(0.874), array(0.848), array(0.816), array(0.744), array(0.638), array(0.528), array(0.328), array(0.24), array(0.072), array(-0.034), array(-0.202), array(-0.32), array(-0.498), array(-0.616), array(-0.672), array(-0.752)], 'braket_tasks_cost': 0.375}\n", - "CPU times: user 160 ms, sys: 16.6 ms, total: 177 ms\n", - "Wall time: 7min 23s\n" - ] - } - ], - "source": [ - "%%time\n", - "results = job.result()\n", - "print(results)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:50:26.336487Z", - "start_time": "2024-02-19T21:49:52.820854Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Minimized circuit output: 0.37261070647126565\n", - "Optimized parameters: [0.4839502 1.13630274]\n" - ] - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(results[\"costs\"], \"o-\")\n", - "plt.xlabel(\"Iterations\")\n", - "plt.ylabel(\"Cost\")\n", - "\n", - "print(\"Minimized circuit output:\", circuit(params))\n", - "print(\"Optimized parameters:\", params)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "ExecuteTime": { - "end_time": "2024-02-19T21:50:26.756331Z", - "start_time": "2024-02-19T21:50:26.338055Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", - "Estimated cost to run this example: 0.386 USD\n" - ] - } - ], - "source": [ - "job_cost = job.result()[\"braket_tasks_cost\"]\n", - "sv1_cost = float(braket_tasks_cost.simulator_tasks_cost())\n", - "\n", - "print(\n", - " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", - ")\n", - "print(f\"Estimated cost to run this example: {job_cost + sv1_cost :.3f} USD\")" - ] - } - ], - "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.9" - }, - "vscode": { - "interpreter": { - "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" - } - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Combining PennyLane with Amazon Braket" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "What is PennyLane? PennyLane is a Python library for differentiable programming of quantum computers, allowing you to train a quantum computer the same way as a neural network.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PennyLane integrates with Amazon Braket to add additional features for quantum machine learning and optimization. This introductory tutorial walks you through how to train a quantum circuit using Amazon Braket simulators and PennyLane's automatic differentiation capabilities." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "PennyLane is already installed on Braket notebook instances. On a local machine, PennyLane can be installed by following [these](https://pennylane.ai/install.html) instructions. It can then be imported with:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:09.404557Z", + "start_time": "2024-02-19T21:42:03.275541Z" + } + }, + "outputs": [], + "source": [ + "import pennylane as qml\n", + "from pennylane import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To use Braket as a backend in PennyLane, we have to create a PennyLane device. Here we will first create a device that uses the local Braket simulator that runs on your local laptop (or on the server that hosts this notebook)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.351825Z", + "start_time": "2024-02-19T21:42:09.405882Z" + } + }, + "outputs": [], + "source": [ + "wires = 2 # Number of qubits\n", + "\n", + "dev = qml.device(\"braket.local.qubit\", wires=wires)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Below we will also show you how to scale out simulations to the AWS cloud." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining a circuit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will choose a simple two-qubit circuit with two controllable rotations and a CNOT gate." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.355051Z", + "start_time": "2024-02-19T21:42:10.352639Z" + } + }, + "outputs": [], + "source": [ + "@qml.qnode(dev)\n", + "def circuit(params):\n", + " qml.RX(params[0], wires=0)\n", + " qml.RY(params[1], wires=1)\n", + " qml.CNOT(wires=[0, 1])\n", + " return qml.expval(qml.PauliZ(1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The ``qml.qnode(dev)`` decorator binds the circuit to the local Braket device. Now, every time that ``circuit()`` is called, the quantum computation defined in the function above will be executed with Braket." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "Note PennyLane also supports automatic differentiation with PyTorch and TensorFlow interfaces. The choice of interface can be specified using:\n", + "@qml.qnode(dev, interface=\"<interface>\").\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluating the circuit and accessing its gradient" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's set some values for our controllable parameters:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.359085Z", + "start_time": "2024-02-19T21:42:10.356833Z" + } + }, + "outputs": [], + "source": [ + "params = np.array([0.1, 0.2], requires_grad=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The circuit can be evaluated with these parameters using" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.393070Z", + "start_time": "2024-02-19T21:42:10.359915Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Expectation value of circuit: 0.9751703272018161\n" + ] + } + ], + "source": [ + "print(\"Expectation value of circuit:\", circuit(params))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.397595Z", + "start_time": "2024-02-19T21:42:10.394259Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Drawing of circuit:\n", + "\n", + "0: ──RX(0.10)─╭●─┤ \n", + "1: ──RY(0.20)─╰X─┤ \n" + ] + } + ], + "source": [ + "print(\"Drawing of circuit:\\n\")\n", + "print(qml.draw(circuit)(params))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A crucial element of machine learning and optimization is accessing the gradient of a model with respect to its parameters. This functionality is built into PennyLane:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.400540Z", + "start_time": "2024-02-19T21:42:10.398616Z" + } + }, + "outputs": [], + "source": [ + "dcircuit = qml.grad(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, ``dcircuit`` is a callable function that evaluates the gradient of the circuit, i.e., its partial derivatives with respect to the controllable parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.523442Z", + "start_time": "2024-02-19T21:42:10.401286Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-0.0978434 , -0.19767681])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dcircuit(params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training the circuit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Suppose we now want to minimize the output of the circuit by updating its parameters. This can be done using gradient-based optimization.\n", + "\n", + "First, an optimizer is fixed:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:10.526039Z", + "start_time": "2024-02-19T21:42:10.524244Z" + } + }, + "outputs": [], + "source": [ + "opt = qml.GradientDescentOptimizer(stepsize=0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next step is to run the optimizer for a chosen number of iterations:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:11.062067Z", + "start_time": "2024-02-19T21:42:10.527962Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Minimized circuit output: 0.37261070647126565\n", + "Optimized parameters: [0.4839502 1.13630274]\n" + ] }, - "nbformat": 4, - "nbformat_minor": 4 + { + "data": { + "image/png": "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6D5xcXG12o8cORLHjx9HZWVls9XaFDQaDQDAw8Oj3rZ33nknVCoVhg0bhr179zZ3abflwoUL8PHxQUBAACZNmoT09PQ621rz+auoqMC6devwxBNP1LtArDWdvxoZGRnIyckxOD+Ojo4YMmRInd9HoO5zamqflkSj0UAQBLi5uZlsV1JSAj8/P3Tq1An3338/EhMTLVNgI+zbtw+enp7o0aMHnn76aeTl5Zlsb83nMDc3Fz/99BOefPLJetu2xHN46+9CS/4eMtyYKT8/H1qtFl5eXgbbvby8kJOTY3SfnJwco+2rqqqQn5/fbLXeLlEUER0djbvuugshISF1tlOpVPjiiy+wefNmbNmyBYGBgRg2bBgOHDhgwWrNN2DAAHz99df45Zdf8N///hc5OTmIjIxEQUGB0fbWev4AYNu2bbh+/TqmT59eZxtrO39/V/Oda8j3sWa/hu7TUpSVlWHevHl49NFHTS5G2LNnT6xZswY//PADvv32WygUCgwaNAgXLlywYLXmGT16NNavX489e/bgww8/xLFjxzB06FCUl5fXuY81n8O1a9fCxcUF48ePN9muJZ5DY78LLfl72OpWBb9dt/4tWBRFk38zNtbe2PaWZNasWTh16hQOHTpksl1gYCACAwP1zyMiIpCVlYUPPvgAd999d3OX2WCjR4/W/3vv3r0RERGBrl27Yu3atYiOjja6jzWePwBYtWoVRo8eDR8fnzrbWNv5M6ah38fG7iO1yspKTJo0CTqdDitXrjTZduDAgQaDcgcNGoTQ0FAsX74cn3zySXOX2iATJ07U/3tISAj69esHPz8//PTTTyYDgDWeQwBYvXo1HnvssXrHzrTEc2jqd6Elfg955cZM7du3h1wur5Us8/LyaiXQGt7e3kbb29nZoV27ds1W6+14/vnn8cMPP2Dv3r3o1KlTg/cfOHBgi/wbojFt2rRB796966zXGs8fAFy6dAm7d+/GU0891eB9reX81dzl1pDvY81+Dd1HapWVlZgwYQIyMjIQGxtr8qqNMTKZDP3797eK86pSqeDn52eyVms8hwBw8OBBnDt3rlHfS6nPYV2/Cy35e8hwYyYHBweEhYXp70CpERsbi8jISKP7RERE1Gr/66+/ol+/frC3t2+2WhtDFEXMmjULW7ZswZ49exAQENCo90lMTIRKpWri6ppHeXk5UlNT66zXms7f33311Vfw9PTEfffd1+B9reX8BQQEwNvb2+D8VFRUYP/+/XV+H4G6z6mpfaRUE2wuXLiA3bt3NypUi6KIpKQkqzivBQUFyMrKMlmrtZ3DGqtWrUJYWBj69OnT4H2lOof1/S606O9hkw1NbgW+++470d7eXly1apWYkpIizpkzR2zTpo148eJFURRFcd68eeKUKVP07dPT00VnZ2dx7ty5YkpKirhq1SrR3t5e3LRpk1SHUKeZM2eKSqVS3Ldvn6hWq/WP0tJSfZtbj++jjz4St27dKp4/f15MTk4W582bJwIQN2/eLMUh1OvFF18U9+3bJ6anp4u///67eP/994suLi42cf5qaLVasXPnzuKrr75a6zVrO3/FxcViYmKimJiYKAIQly5dKiYmJurvFHrnnXdEpVIpbtmyRTx9+rT4yCOPiCqVSiwqKtK/x5QpUwzuZjx8+LAol8vFd955R0xNTRXfeecd0c7OTvz9998tfnyiaPoYKysrxQceeEDs1KmTmJSUZPC9LC8v17/Hrcf45ptvirt27RLT0tLExMRE8fHHHxft7OzEo0ePtqjjKy4uFl988UXxyJEjYkZGhrh3714xIiJC7Nixo82cwxoajUZ0dnYWY2JijL5HSz2H5vwutNTvIcNNA61YsUL08/MTHRwcxNDQUINbpadNmyYOGTLEoP2+ffvEO++8U3RwcBD9/f3r/J9bagCMPr766it9m1uP79133xW7du0qKhQK0d3dXbzrrrvEn376yfLFm2nixImiSqUS7e3tRR8fH3H8+PHimTNn9K9b8/mr8csvv4gAxHPnztV6zdrOX82t6rc+pk2bJopi9W2oCxcuFL29vUVHR0fx7rvvFk+fPm3wHkOGDNG3r7Fx40YxMDBQtLe3F3v27ClpmDN1jBkZGXV+L/fu3at/j1uPcc6cOWLnzp1FBwcHsUOHDmJUVJR45MgRyx+caPr4SktLxaioKLFDhw6ivb292LlzZ3HatGliZmamwXtY8zms8fnnn4tOTk7i9evXjb5HSz2H5vwutNTvofDnARARERHZBI65ISIiIpvCcENEREQ2heGGiIiIbArDDREREdkUhhsiIiKyKQw3REREZFMYboiIiMimMNwQUavg7++PZcuWSV0GEVkAww0RNbnp06dj3LhxAIB77rkHc+bMsdhnr1mzBm5ubrW2Hzt2DP/85z8tVgcRScdO6gKIiMxRUVEBBweHRu/foUOHJqyGiFoyXrkhomYzffp07N+/Hx9//DEEQYAgCLh48SIAICUlBWPGjEHbtm3h5eWFKVOmID8/X7/vPffcg1mzZiE6Ohrt27fHiBEjAABLly5F79690aZNG/j6+uLZZ59FSUkJAGDfvn14/PHHodFo9J/35ptvAqjdLZWZmYkHH3wQbdu2haurKyZMmIDc3Fz962+++Sb69u2Lb775Bv7+/lAqlZg0aRKKi4v1bTZt2oTevXvDyckJ7dq1w/Dhw3Hjxo1m+q9JROZiuCGiZvPxxx8jIiICTz/9NNRqNdRqNXx9faFWqzFkyBD07dsXx48fx65du5Cbm4sJEyYY7L927VrY2dnh8OHD+PzzzwEAMpkMn3zyCZKTk7F27Vrs2bMHr7zyCgAgMjISy5Ytg6urq/7zXnrppVp1iaKIcePGobCwEPv370dsbCzS0tIwceJEg3ZpaWnYtm0bfvzxR/z444/Yv38/3nnnHQCAWq3GI488gieeeAKpqanYt28fxo8fDy7XRyQ9dksRUbNRKpVwcHCAs7MzvL299dtjYmIQGhqKt99+W79t9erV8PX1xfnz59GjRw8AQLdu3fDee+8ZvOffx+8EBATgrbfewsyZM7Fy5Uo4ODhAqVRCEASDz7vV7t27cerUKWRkZMDX1xcA8M0336BXr144duwY+vfvDwDQ6XRYs2YNXFxcAABTpkzBb7/9hv/85z9Qq9WoqqrC+PHj4efnBwDo3bv3bfzXIqKmwis3RGRxCQkJ2Lt3L9q2bat/9OzZE0D11ZIa/fr1q7Xv3r17MWLECHTs2BEuLi6YOnUqCgoKGtQdlJqaCl9fX32wAYDg4GC4ubkhNTVVv83f318fbABApVIhLy8PANCnTx8MGzYMvXv3xsMPP4z//ve/uHbtmvn/EYio2TDcEJHF6XQ6jB07FklJSQaPCxcu4O6779a3a9OmjcF+ly5dwpgxYxASEoLNmzcjISEBK1asAABUVlaa/fmiKEIQhHq329vbG7wuCAJ0Oh0AQC6XIzY2Fj///DOCg4OxfPlyBAYGIiMjw+w6iKh5MNwQUbNycHCAVqs12BYaGoozZ87A398f3bp1M3jcGmj+7vjx46iqqsKHH36IgQMHokePHrhy5Uq9n3er4OBgZGZmIisrS78tJSUFGo0GQUFBZh+bIAgYNGgQFi1ahMTERDg4OGDr1q1m709EzYPhhoialb+/P44ePYqLFy8iPz8fOp0Ozz33HAoLC/HII48gPj4e6enp+PXXX/HEE0+YDCZdu3ZFVVUVli9fjvT0dHzzzTf47LPPan1eSUkJfvvtN+Tn56O0tLTW+wwfPhx33HEHHnvsMZw4cQLx8fGYOnUqhgwZYrQrzJijR4/i7bffxvHjx5GZmYktW7bg6tWrDQpHRNQ8GG6IqFm99NJLkMvlCA4ORocOHZCZmQkfHx8cPnwYWq0WI0eOREhICF544QUolUrIZHX/sdS3b18sXboU7777LkJCQrB+/XosWbLEoE1kZCRmzJiBiRMnokOHDrUGJAPVV1y2bdsGd3d33H333Rg+fDi6dOmCDRs2mH1crq6uOHDgAMaMGYMePXrgtddew4cffojRo0eb/x+HiJqFIPK+RSIiIrIhvHJDRERENoXhhoiIiGwKww0RERHZFIYbIiIisikMN0RERGRTGG6IiIjIpjDcEBERkU1huCEiIiKbwnBDRERENoXhhoiIiGwKww0RERHZFIYbIiIisin/DwPsQI/yMsJ2AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "iterations = 20\n", + "\n", + "costs = []\n", + "\n", + "for i in range(iterations):\n", + " params, cost = opt.step_and_cost(circuit, params)\n", + " costs.append(cost)\n", + "\n", + "# Visualize results\n", + "costs.append(circuit(params))\n", + "plt.plot(costs, \"-o\")\n", + "plt.xlabel(\"Iterations\")\n", + "plt.ylabel(\"Cost\")\n", + "\n", + "print(\"Minimized circuit output:\", circuit(params))\n", + "print(\"Optimized parameters:\", params)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "Note The circuit considered here is very simple and can be optimized easily by hand. However, the need for PennyLane's automatic differentiation capabilities becomes apparent as we make the problem more complicated, e.g., with more gates and different types of output measurement. In later demos, we will also see how Braket can be used to parallelize evaluation of the gradient, providing a turbocharger for quantum circuit training in PennyLane.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running circuits on Braket's on-demand simulator, SV1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far we have used the local Braket simulator. This is a great choice for quick prototyping, but it is not suitable for large circuits with many qubits and does not provide a connection to quantum hardware.\n", + "\n", + "Amazon Braket also provides access to on-demand, high-performance simulators and quantum processing units (QPUs) from different [providers](https://aws.amazon.com/braket/hardware-providers/). These devices can be accessed through PennyLane by changing a single line of code, unlocking the potential for machine learning and optimization on quantum hardware and high performance simulators!\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:11.066378Z", + "start_time": "2024-02-19T21:42:11.064297Z" + } + }, + "outputs": [], + "source": [ + "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", + "from braket.tracking import Tracker\n", + "\n", + "braket_tasks_cost = Tracker().start()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each remote Braket device can be selected through its [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html). The supported devices on Braket are listed [here](https://docs.aws.amazon.com/braket/latest/developerguide/braket-devices.html). For now, we will pick the on-demand SV1 simulator.\n", + "\n", + "
\n", + "Caution: Running hybrid algorithms on a QPU can take a long time and incur high usage fees charged to your AWS account.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "In PennyLane, all remote Braket devices are then accessed through a single PennyLane device named ``braket.aws.qubit``." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:11.437758Z", + "start_time": "2024-02-19T21:42:11.067501Z" + } + }, + "outputs": [], + "source": [ + "from braket.devices import Devices\n", + "\n", + "dev = qml.device(\"braket.aws.qubit\", device_arn=Devices.Amazon.SV1, wires=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A follow up [tutorial](./1_Parallelized_optimization_of_quantum_circuits.ipynb) shows you how to use the remote device to run multiple circuits in parallel, while the [QAOA tutorial](./2_Graph_optimization_with_QAOA.ipynb) takes a deeper dive into graph optimization, including using SV1 to optimize a 20-node graph." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's execute our circuit on SV1, as well as calculating the gradient:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:18.632136Z", + "start_time": "2024-02-19T21:42:11.439272Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Result of circuit run on SV1: 0.37261070647126565\n", + "Result of gradient calculation on SV1: [-0.19585986 -0.80291741]\n" + ] + } + ], + "source": [ + "@qml.qnode(dev)\n", + "def circuit(params):\n", + " qml.RX(params[0], wires=0)\n", + " qml.RY(params[1], wires=1)\n", + " qml.CNOT(wires=[0, 1])\n", + " return qml.expval(qml.PauliZ(1))\n", + "\n", + "\n", + "dcircuit = qml.grad(circuit)\n", + "\n", + "print(\"Result of circuit run on SV1:\", circuit(params))\n", + "print(\"Result of gradient calculation on SV1:\", dcircuit(params))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "What's next? Check out the other tutorials in this folder to understand how Braket and PennyLane can be combined to solve a range of problems, from graph optimization to quantum chemistry.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:19.098494Z", + "start_time": "2024-02-19T21:42:18.633487Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum Task Summary\n", + "{<_Amazon.SV1: 'arn:aws:braket:::device/quantum-simulator/amazon/sv1'>: {'shots': 0, 'tasks': {'COMPLETED': 2}, 'execution_duration': datetime.timedelta(microseconds=299000), 'billed_execution_duration': datetime.timedelta(seconds=6)}}\n", + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run this example: 0.008 USD\n" + ] + } + ], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(braket_tasks_cost.quantum_tasks_statistics())\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {braket_tasks_cost.qpu_tasks_cost() + braket_tasks_cost.simulator_tasks_cost():.3f} USD\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running on a QPU with Amazon Braket Hybrid Jobs\n", + "\n", + "In this notebook, the classical part of the algorithm was running locally. For longer-running algorithms or those requiring more intensive compute resources, it's recommended to dispatch the algorithm to Amazon Braket Hybrid Jobs, which fully manages the classical infrastructure, allowing you to focus on the algorithm. For example, you can train a larger circuit or increase the number of iterations.\n", + "\n", + "The second benefit of running the algorithm as a hybrid job is that for iterative algorithms that require repeated calls to a QPU, you retain priority for that QPU. Once your quantum tasks are created in the hybrid job, they run ahead of other tasks waiting in the regular quantum task queue. This is because hybrid jobs have a separate queue from standalone tasks, ensuring that only a single hybrid job can run on a QPU at a time. This means your algorithm will not be interrupted by other quantum tasks, so it will run more efficiently and predictably. However, hybrid jobs have a separate queue from standalone tasks, so only a single hybrid job can run on a QPU at a time. For a single quantum circuit or a batch of circuits, it's recommended to create quantum tasks instead of hybrid jobs. Only iterative algorithms benefit from QPU priority queuing.\n", + "\n", + "Note that hybrid jobs have at least a one-minute startup time since they create a containerized environment on Amazon EC2. So for very short workloads, there is likely no need to create a hybrid job.\n", + "\n", + "You can run your local Python code as an Amazon Braket hybrid job by annotating your code with the `@hybrid_job`` decorator, as shown in the following code example. Only Python 3.10 is supported by default. For custom Python versions, you can choose to use a custom container from [Amazon Elastic Container Registry (ECR)](https://aws.amazon.com/ecr/) (see [BYOC](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs-byoc.html)).\n", + "\n", + "\n", + "In the following code, we create a hybrid job for 10 iterations targeting Rigetti Ankaa-2. Since we specified Ankaa-2 as the device, this job will run once Ankaa-2 is available and has no jobs running ahead of it." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:19.442699Z", + "start_time": "2024-02-19T21:42:19.099758Z" + } + }, + "outputs": [], + "source": [ + "from braket.jobs import hybrid_job\n", + "from braket.jobs.metrics import log_metric\n", + "\n", + "device_arn = Devices.Amazon.SV1\n", + "# device_arn = Devices.Rigetti.Ankaa2\n", + "\n", + "\n", + "@hybrid_job(device=device_arn) # set priority QPU\n", + "def qubit_rotation(stepsize=0.1, iterations=5):\n", + " task_tracker = Tracker().start() # track Braket quantum tasks costs\n", + " dev = qml.device(\"braket.aws.qubit\", device_arn=device_arn.value, wires=2, shots=1_000)\n", + "\n", + " params = np.array([0.1, 0.2])\n", + "\n", + " @qml.qnode(dev)\n", + " def circuit(params):\n", + " qml.RX(params[0], wires=0)\n", + " qml.RY(params[1], wires=1)\n", + " qml.CNOT(wires=[0, 1])\n", + " return qml.expval(qml.PauliZ(1))\n", + "\n", + " opt = qml.GradientDescentOptimizer(stepsize)\n", + "\n", + " costs = []\n", + " for i in range(iterations):\n", + " params, cost = opt.step_and_cost(circuit, params)\n", + " costs.append(cost)\n", + "\n", + " # Record the value of the cost function with each iteration\n", + " log_metric(metric_name=\"cost_function\", value=cost, iteration_number=i)\n", + "\n", + " # Additionally, keep track of cost in USD for Braket tasks\n", + " braket_task_cost = float(\n", + " task_tracker.qpu_tasks_cost() + task_tracker.simulator_tasks_cost()\n", + " )\n", + " log_metric(metric_name=\"braket_cost\", value=braket_task_cost, iteration_number=i)\n", + "\n", + " return {\"params\": params, \"costs\": costs, \"braket_tasks_cost\": braket_task_cost}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How long will it take the hybrid job to run? \n", + "Let's first check if the device is currently available with `AwsDevice(device_arn).is_available()`. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:19.614223Z", + "start_time": "2024-02-19T21:42:19.443623Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from braket.aws import AwsDevice\n", + "\n", + "AwsDevice(device_arn).is_available" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we check the hybrid job queue depth with `AwsDevice(device_arn).queue_depth().jobs`. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:19.958746Z", + "start_time": "2024-02-19T21:42:19.615073Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'0'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "AwsDevice(device_arn).queue_depth().jobs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the device is available and there are no hybrid jobs currently running, then it should take about 5 minutes to complete. \n", + "\n", + "
\n", + "Caution: Running the following cell will only run once the QPU is available. This may take a long time and will result in usage fees charged to your AWS account. Only uncomment the cell if you are comfortable with the potential wait-time and costs. We recommend monitoring the Billing & Cost Management Dashboard on the AWS console and being aware that hybrid jobs involving a large number of qubits can be costly.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:42:29.440989Z", + "start_time": "2024-02-19T21:42:19.960142Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AwsQuantumJob('arn':'arn:aws:braket:us-west-2:667256736152:job/qubit-rotation-1708378939963')\n" + ] + } + ], + "source": [ + "job = qubit_rotation(stepsize=0.2, iterations=20)\n", + "print(job)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the hybrid job has completed, we can retrieve the results with `job.results()`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:49:52.814493Z", + "start_time": "2024-02-19T21:42:29.442078Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'params': tensor([0.236, 2.649], requires_grad=True), 'costs': [array(0.978), array(0.954), array(0.962), array(0.93), array(0.874), array(0.848), array(0.816), array(0.744), array(0.638), array(0.528), array(0.328), array(0.24), array(0.072), array(-0.034), array(-0.202), array(-0.32), array(-0.498), array(-0.616), array(-0.672), array(-0.752)], 'braket_tasks_cost': 0.375}\n", + "CPU times: user 160 ms, sys: 16.6 ms, total: 177 ms\n", + "Wall time: 7min 23s\n" + ] + } + ], + "source": [ + "%%time\n", + "results = job.result()\n", + "print(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:50:26.336487Z", + "start_time": "2024-02-19T21:49:52.820854Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Minimized circuit output: 0.37261070647126565\n", + "Optimized parameters: [0.4839502 1.13630274]\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(results[\"costs\"], \"o-\")\n", + "plt.xlabel(\"Iterations\")\n", + "plt.ylabel(\"Cost\")\n", + "\n", + "print(\"Minimized circuit output:\", circuit(params))\n", + "print(\"Optimized parameters:\", params)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2024-02-19T21:50:26.756331Z", + "start_time": "2024-02-19T21:50:26.338055Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\n", + "Estimated cost to run this example: 0.386 USD\n" + ] + } + ], + "source": [ + "job_cost = job.result()[\"braket_tasks_cost\"]\n", + "sv1_cost = float(braket_tasks_cost.simulator_tasks_cost())\n", + "\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(f\"Estimated cost to run this example: {job_cost + sv1_cost :.3f} USD\")" + ] + } + ], + "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.9" + }, + "vscode": { + "interpreter": { + "hash": "590fab68195cf107911461461f81d5c472d3d6127f579badfcfad30f03e5cab2" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 } diff --git a/examples/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits.ipynb b/examples/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits.ipynb index d9bec194f..7f53311e5 100644 --- a/examples/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits.ipynb +++ b/examples/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits.ipynb @@ -15,6 +15,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -94,6 +95,7 @@ "source": [ "import pennylane as qml\n", "from pennylane import numpy as np\n", + "\n", "from braket.devices import Devices\n", "\n", "wires = 25\n", @@ -307,6 +309,7 @@ "\n", "dev_local = qml.device(\"braket.local.qubit\", wires=wires)\n", "\n", + "\n", "def circuit(params):\n", " for i in range(wires):\n", " qml.RX(params[i], wires=i)\n", @@ -314,6 +317,7 @@ " qml.CNOT(wires=[i, (i + 1) % wires])\n", " return qml.expval(qml.PauliZ(wires - 1))\n", "\n", + "\n", "qnode_remote = qml.QNode(circuit, dev_remote)\n", "qnode_local = qml.QNode(circuit, dev_local)\n", "\n", @@ -389,8 +393,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA.ipynb b/examples/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA.ipynb index 49ede2d76..d79d65da0 100644 --- a/examples/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA.ipynb +++ b/examples/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA.ipynb @@ -202,7 +202,7 @@ "metadata": {}, "outputs": [], "source": [ - "def qaoa_layer(gamma, alpha):\n", + "def qaoa_layer(gamma, alpha): # noqa: F811\n", " qml.qaoa.cost_layer(gamma, cost_h)\n", " qml.qaoa.mixer_layer(alpha, mixer_h)" ] @@ -449,7 +449,7 @@ "%matplotlib inline\n", "\n", "plt.style.use(\"seaborn-v0_8-colorblind\")\n", - "labels = [\"{0:{fill}{length}b}\".format(i, fill='0', length=wires) for i in range(len(probs))]\n", + "labels = [\"{0:{fill}{length}b}\".format(i, fill=\"0\", length=wires) for i in range(len(probs))]\n", "\n", "plt.bar(range(2**wires), probs.values())\n", "plt.xticks([i for i in range(len(probs))], labels, rotation=\"vertical\", size=12)\n", @@ -613,7 +613,7 @@ "metadata": {}, "outputs": [], "source": [ - "def qaoa_layer(gamma, alpha):\n", + "def qaoa_layer(gamma, alpha): # noqa: F811\n", " qml.qaoa.cost_layer(gamma, cost_h)\n", " qml.qaoa.mixer_layer(alpha, mixer_h)" ] @@ -626,6 +626,7 @@ "source": [ "n_layers = 2\n", "\n", + "\n", "@qml.qnode(dev)\n", "def cost_function(params, **kwargs):\n", " for i in range(wires): # Prepare an equal superposition over all qubits\n", @@ -680,8 +681,7 @@ "metadata": {}, "outputs": [], "source": [ - "import time\n", - "from braket.jobs import hybrid_job, InstanceConfig\n", + "from braket.jobs import InstanceConfig, hybrid_job\n", "from braket.jobs.metrics import log_metric\n", "\n", "large_instance = InstanceConfig(instanceType=\"ml.c5.xlarge\")\n", diff --git a/examples/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE.ipynb b/examples/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE.ipynb index 1a5f87f97..130ca6ab9 100644 --- a/examples/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE.ipynb +++ b/examples/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE.ipynb @@ -44,8 +44,8 @@ "outputs": [], "source": [ "import pennylane as qml\n", - "from pennylane import qchem\n", - "from pennylane import numpy as np" + "from pennylane import numpy as np\n", + "from pennylane import qchem" ] }, { @@ -242,7 +242,7 @@ "\n", "\n", "@qml.qnode(dev)\n", - "def S2_expval(params):\n", + "def S2_expval(params): # noqa: F811\n", " circuit(params, wires)\n", " return qml.expval(S2)" ] @@ -358,6 +358,7 @@ "outputs": [], "source": [ "import time\n", + "\n", "from braket.jobs.metrics import log_metric\n", "\n", "\n", @@ -529,7 +530,7 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.jobs import hybrid_job, InstanceConfig\n", + "from braket.jobs import InstanceConfig, hybrid_job\n", "from braket.tracking import Tracker\n", "\n", "large_instance = InstanceConfig(instanceType=\"ml.c5.xlarge\")\n", @@ -781,7 +782,7 @@ "\n", "\n", "@qml.qnode(dev)\n", - "def S2_expval(params):\n", + "def S2_expval(params): # noqa: F811\n", " circuit(params, wires)\n", " return qml.expval(S2)\n", "\n", diff --git a/examples/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane.ipynb b/examples/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane.ipynb index 47a6aa781..e75caec4b 100644 --- a/examples/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane.ipynb +++ b/examples/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane.ipynb @@ -17,6 +17,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -64,16 +65,16 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.devices import Devices\n", - "import pennylane as qml\n", - "from pennylane import numpy as np\n", - "\n", "import time\n", "from collections import Counter\n", "\n", "import matplotlib.pyplot as plt\n", "import networkx as nx\n", - "from scipy.stats import unitary_group" + "import pennylane as qml\n", + "from pennylane import numpy as np\n", + "from scipy.stats import unitary_group\n", + "\n", + "from braket.devices import Devices" ] }, { @@ -125,9 +126,9 @@ "source": [ "def ghz_circuits(noise_opt, wires):\n", " \"\"\"\n", - " Function to return simple GHZ circuit ansatz, subject to a given noise operator. \n", + " Function to return simple GHZ circuit ansatz, subject to a given noise operator.\n", " The output is a method for specifying the number of qubits and the noise strength of the GHZ circuit.\n", - " The result type is `Probability`. \n", + " The result type is `Probability`.\n", " \"\"\"\n", "\n", " def circuits(p):\n", @@ -264,19 +265,19 @@ "axs[0][1].set_title(\"Depolarizing\", size=20)\n", "# axs.set_ylabel('Probability')\n", "for ii in range(len(ps)):\n", - " axs[ii][0].bar(range(2 ** wires), res_1[ii])\n", - " axs[ii][1].bar(range(2 ** wires), res_2[ii])\n", + " axs[ii][0].bar(range(2**wires), res_1[ii])\n", + " axs[ii][1].bar(range(2**wires), res_2[ii])\n", " axs[ii][0].set_ylim([0, 0.55])\n", " axs[ii][1].set_ylim([0, 0.55])\n", " textstr = \"\".join((\"p=\", str(ps[ii])))\n", - " axs[ii][0].text(2 ** wires / 2, 0.3, textstr, fontsize=20)\n", - " axs[ii][1].text(2 ** wires / 2, 0.3, textstr, fontsize=20)\n", + " axs[ii][0].text(2**wires / 2, 0.3, textstr, fontsize=20)\n", + " axs[ii][1].text(2**wires / 2, 0.3, textstr, fontsize=20)\n", "axs[2][0].set_ylabel(\"Probability\", size=20)\n", "for ax in axs.flat:\n", " ax.set_xlabel(\"Bit string\", size=20)\n", "for ax in axs.flat:\n", " ax.label_outer()\n", - " \n", + "\n", "plt.show()" ] }, @@ -306,8 +307,8 @@ "source": [ "def ghz_circuits_custom_noise(wires, Ks):\n", " \"\"\"\n", - " Function to return simple GHZ circuit ansatz with customized noise channel. \n", - " The result type is `Probability`. \n", + " Function to return simple GHZ circuit ansatz with customized noise channel.\n", + " The result type is `Probability`.\n", " \"\"\"\n", " qml.Hadamard(wires=0)\n", " qml.QubitChannel(Ks, wires=0)\n", @@ -367,8 +368,12 @@ "res_custom = []\n", "\n", "for p in ps:\n", - " Ks = [np.sqrt(1 - p) * Ks_basis[0], np.sqrt(p / 3) * Ks_basis[1], \n", - " np.sqrt(p / 3) * Ks_basis[2], np.sqrt(p / 3) * Ks_basis[3]]\n", + " Ks = [\n", + " np.sqrt(1 - p) * Ks_basis[0],\n", + " np.sqrt(p / 3) * Ks_basis[1],\n", + " np.sqrt(p / 3) * Ks_basis[2],\n", + " np.sqrt(p / 3) * Ks_basis[3],\n", + " ]\n", " res_custom.append(ghz(wires, Ks))\n", "\n", "print(\"\")\n", @@ -379,16 +384,16 @@ " size=20,\n", ")\n", "for ii in range(len(ps)):\n", - " axs[ii].bar(range(2 ** wires), res_custom[ii])\n", + " axs[ii].bar(range(2**wires), res_custom[ii])\n", " textstr = \"\".join((\"p=\", str(ps[ii])))\n", - " axs[ii].text(2 ** wires / 2, 0.3, textstr, fontsize=20)\n", + " axs[ii].text(2**wires / 2, 0.3, textstr, fontsize=20)\n", " axs[ii].set_ylim([0, 0.55])\n", " axs[ii].set_ylim([0, 0.55])\n", "for ax in axs.flat:\n", " ax.set_xlabel(\"Bit string\", size=20)\n", "for ax in axs.flat:\n", " ax.label_outer()\n", - " \n", + "\n", "plt.show()" ] }, @@ -421,8 +426,8 @@ "source": [ "def qaoa_layer_noise(γ, α, noise_opt, p, n_nodes, cost_h, mixer_h):\n", " \"\"\"\n", - " A QAOA layer with noise, simulated by noise_opt with noise strength p. \n", - " cost_h and mixer_h are the cost and mixer Hamiltonian from the given graph with n_nodes nodes. \n", + " A QAOA layer with noise, simulated by noise_opt with noise strength p.\n", + " cost_h and mixer_h are the cost and mixer Hamiltonian from the given graph with n_nodes nodes.\n", " γ, α are the tuning parameters of the QAOA.\n", " \"\"\"\n", " qml.qaoa.cost_layer(γ, cost_h)\n", @@ -450,9 +455,9 @@ "source": [ "def QAOA(g, n_layers, noise_opt, p, dev):\n", " \"\"\"\n", - " Get the cost function and sampling function for the QAOA, with n_layers layers. \n", - " dev is the device on which the QAOA will be run. \n", - " g is the graph on which the problem is defined. \n", + " Get the cost function and sampling function for the QAOA, with n_layers layers.\n", + " dev is the device on which the QAOA will be run.\n", + " g is the graph on which the problem is defined.\n", " \"\"\"\n", " n_nodes = len(g.nodes)\n", " cost_h, mixer_h = qml.qaoa.max_clique(g, constrained=False)\n", @@ -467,21 +472,21 @@ " qml.layer(\n", " qaoa_layer_noise,\n", " n_layers,\n", - " params[0], # These parameters are γ's \n", - " params[1], # These parameters are α's \n", + " params[0], # These parameters are γ's\n", + " params[1], # These parameters are α's\n", " [noise_opt for _ in range(n_layers)],\n", " [p for _ in range(n_layers)],\n", " [n_nodes for _ in range(n_layers)],\n", " [cost_h for _ in range(n_layers)],\n", " [mixer_h for _ in range(n_layers)],\n", " )\n", - " \n", - " @qml.qnode(dev, diff_method='parameter-shift')\n", + "\n", + " @qml.qnode(dev, diff_method=\"parameter-shift\")\n", " def cost_fun(params, **kwargs):\n", " circuit(params, **kwargs)\n", " return qml.expval(cost_h)\n", "\n", - " @qml.qnode(dev, diff_method='parameter-shift')\n", + " @qml.qnode(dev, diff_method=\"parameter-shift\")\n", " def samples(params):\n", " \"\"\"\n", " The sampling function for the probability distribution\n", @@ -524,9 +529,7 @@ "\n", " shots = 5000\n", "\n", - " dev_local = qml.device(\n", - " \"braket.local.qubit\", backend=\"braket_dm\", wires=n_nodes, shots=shots\n", - " )\n", + " dev_local = qml.device(\"braket.local.qubit\", backend=\"braket_dm\", wires=n_nodes, shots=shots)\n", "\n", " dev_DM1 = qml.device(\n", " \"braket.aws.qubit\",\n", @@ -540,14 +543,14 @@ " cost_fun_DM1, _ = QAOA(g, n_layers, noise_opt, p, dev_DM1)\n", "\n", " t_0_local = time.time()\n", - " res_local = cost_fun_local(params)\n", + " _res_local = cost_fun_local(params)\n", " t_1_local = time.time()\n", "\n", " t_0_DM1 = time.time()\n", - " res_DM1 = cost_fun_DM1(params)\n", - " t_1_DM1 = time.time() \n", - " \n", - " return t_1_local-t_0_local, t_1_DM1-t_0_DM1" + " _res_DM1 = cost_fun_DM1(params)\n", + " t_1_DM1 = time.time()\n", + "\n", + " return t_1_local - t_0_local, t_1_DM1 - t_0_DM1" ] }, { @@ -575,7 +578,7 @@ ], "source": [ "runtimes_local, runtimes_DM1 = [], []\n", - "n_nodes_list = range(4,6)\n", + "n_nodes_list = range(4, 6)\n", "for n_nodes in n_nodes_list:\n", " runtime_local, runtime_DM1 = compare_dm1_local(n_nodes)\n", " runtimes_local.append(runtime_local)\n", @@ -609,14 +612,14 @@ } ], "source": [ - "n_nodes_list = range(4,12)\n", + "n_nodes_list = range(4, 12)\n", "runtimes_local = np.load(\"runtimes_local.npy\")\n", "runtimes_DM1 = np.load(\"runtimes_DM1.npy\")\n", "\n", - "plt.figure(figsize=(8,4))\n", + "plt.figure(figsize=(8, 4))\n", "plt.suptitle(\"Comparison of runtime on local device and DM1\", size=20)\n", - "plt.plot(n_nodes_list, runtimes_local, 'o-', markersize=10, label='Run time on local device')\n", - "plt.plot(n_nodes_list, runtimes_DM1, 'x-', markersize=10, label='Run time on DM1')\n", + "plt.plot(n_nodes_list, runtimes_local, \"o-\", markersize=10, label=\"Run time on local device\")\n", + "plt.plot(n_nodes_list, runtimes_DM1, \"x-\", markersize=10, label=\"Run time on DM1\")\n", "plt.legend()\n", "plt.xlabel(\"Number of nodes in the graph\", fontsize=20)\n", "plt.ylabel(\"Run time (seconds)\", fontsize=20)\n", @@ -688,7 +691,6 @@ "outputs": [], "source": [ "def get_cost_sampling(g, n_layers, noise_opt, p, params, n_iterations, shots, dev):\n", - "\n", " cost_func, samples = QAOA(g, n_layers, noise_opt, p, dev)\n", "\n", " costs = [cost_func(params)]\n", @@ -702,7 +704,7 @@ " s = samples(params)\n", " s = (1 - np.array(s).numpy().T) / 2\n", " s = list(map(tuple, s))\n", - " \n", + "\n", " counts = Counter(s)\n", " indx = np.ndindex(*[2] * n_nodes)\n", "\n", @@ -778,7 +780,9 @@ " costs_range_2 = []\n", " probs_range_2 = []\n", " for noise_opt in noise_opts:\n", - " print(f\"** Optimizing for {'bit flip' if noise_opt == qml.BitFlip else 'phase damping'} noise, p={p} **\")\n", + " print(\n", + " f\"** Optimizing for {'bit flip' if noise_opt == qml.BitFlip else 'phase damping'} noise, p={p} **\"\n", + " )\n", " costs, probs = get_cost_sampling(\n", " g, n_layers, noise_opt, p, params, n_iterations, shots, dev\n", " )\n", @@ -845,9 +849,7 @@ "plt.legend()\n", "plt.xlabel(\"Iterations\", fontsize=20)\n", "plt.ylabel(\"Cost function\", fontsize=20)\n", - "plt.title(\n", - " \"Comparison of cost functions for bit flip and phase damping channels\", size=20\n", - ")\n", + "plt.title(\"Comparison of cost functions for bit flip and phase damping channels\", size=20)\n", "plt.show()\n", "\n", "fig, axs = plt.subplots(len(ps), 2, figsize=(12, 8))\n", @@ -858,13 +860,13 @@ "axs[0][0].set_title(\"BitFlip\", fontsize=20)\n", "axs[0][1].set_title(\"PhaseDamping\", fontsize=20)\n", "for ii in range(len(ps)):\n", - " axs[ii][0].bar(range(2 ** n_nodes), probs_range[ii][0].tolist().values())\n", - " axs[ii][1].bar(range(2 ** n_nodes), probs_range[ii][1].tolist().values())\n", + " axs[ii][0].bar(range(2**n_nodes), probs_range[ii][0].tolist().values())\n", + " axs[ii][1].bar(range(2**n_nodes), probs_range[ii][1].tolist().values())\n", " axs[ii][0].set_ylim([0, 0.5])\n", " axs[ii][1].set_ylim([0, 0.5])\n", " textstr = \"\".join((\"p=\", str(ps[ii])))\n", - " axs[ii][0].text(2 ** n_nodes / 2, 0.3, textstr, fontsize=20)\n", - " axs[ii][1].text(2 ** n_nodes / 2, 0.3, textstr, fontsize=20)\n", + " axs[ii][0].text(2**n_nodes / 2, 0.3, textstr, fontsize=20)\n", + " axs[ii][1].text(2**n_nodes / 2, 0.3, textstr, fontsize=20)\n", "axs[1][0].set_ylabel(\"Probability\", fontsize=20)\n", "for ax in axs.flat:\n", " ax.set_xlabel(\"Bit string\", size=20)\n", @@ -916,8 +918,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage.ipynb b/examples/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage.ipynb index 3cb6756a4..30811199e 100644 --- a/examples/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage.ipynb +++ b/examples/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage.ipynb @@ -33,11 +33,12 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.devices import Devices\n", + "import time\n", + "\n", "import pennylane as qml\n", "from pennylane import numpy as np\n", "\n", - "import time" + "from braket.devices import Devices" ] }, { @@ -59,12 +60,14 @@ "\n", "dev = qml.device(\"braket.local.qubit\", wires=wires)\n", "\n", + "\n", "def circuit(params):\n", " qml.RX(params[0], wires=0)\n", " qml.RY(params[1], wires=1)\n", " qml.CNOT(wires=[0, 1])\n", " return qml.expval(qml.PauliZ(1))\n", "\n", + "\n", "qnode_local = qml.QNode(circuit, dev)\n", "params = np.array([0.1, 0.2], requires_grad=True)" ] @@ -269,11 +272,7 @@ "source": [ "device_arn = Devices.Amazon.SV1\n", "\n", - "dev_remote = qml.device(\n", - " \"braket.aws.qubit\",\n", - " device_arn=device_arn,\n", - " wires=wires\n", - ")\n", + "dev_remote = qml.device(\"braket.aws.qubit\", device_arn=device_arn, wires=wires)\n", "\n", "qnode_remote = qml.QNode(circuit, dev_remote)" ] @@ -359,7 +358,7 @@ " t0 = time.time()\n", " qnode_remote(params)\n", " t1 = time.time()\n", - "print(\"Remote device execution duration in seconds:\",t1 - t0)\n", + "print(\"Remote device execution duration in seconds:\", t1 - t0)\n", "print(\"Simulation duration in seconds:\", tracker.totals[\"braket_simulator_ms\"] / 1000)" ] }, @@ -440,7 +439,7 @@ "\n", "print(\"Completed\", i + 1, \"steps of optimization.\")\n", "print(\"Optimized cost:\", cost)\n", - "print(\"Optimized parameters:\", params)\n" + "print(\"Optimized parameters:\", params)" ] }, { @@ -509,7 +508,8 @@ ], "source": [ "def log_executions(totals, history, latest):\n", - " print(\"Total executions:\",totals[\"executions\"])\n", + " print(\"Total executions:\", totals[\"executions\"])\n", + "\n", "\n", "with qml.Tracker(dev, callback=log_executions) as tracker:\n", " qml.grad(qnode_local)(params)" @@ -542,19 +542,20 @@ "source": [ "params = np.array([0.1, 0.2], requires_grad=True)\n", "\n", + "\n", "def resource_threshold(totals, history, latest):\n", " if totals[\"executions\"] > execution_limit:\n", " raise ResourceWarning()\n", "\n", + "\n", "with qml.Tracker(dev, callback=resource_threshold) as tracker:\n", " try:\n", " for i in range(max_iterations):\n", - " params,cost = opt.step_and_cost(qnode_local, params)\n", + " params, cost = opt.step_and_cost(qnode_local, params)\n", " except ResourceWarning:\n", - " print(\"Completed\",i,\"steps of optimization.\")\n", + " print(\"Completed\", i, \"steps of optimization.\")\n", " print(\"Optimized cost:\", cost)\n", - " print(\"Optimized parameters:\", params)\n", - "\n" + " print(\"Optimized parameters:\", params)" ] }, { diff --git a/examples/pennylane/6_Adjoint_gradient_computation/6_Adjoint_gradient_computation.ipynb b/examples/pennylane/6_Adjoint_gradient_computation/6_Adjoint_gradient_computation.ipynb index 7df1a9c43..47e6edb1d 100644 --- a/examples/pennylane/6_Adjoint_gradient_computation/6_Adjoint_gradient_computation.ipynb +++ b/examples/pennylane/6_Adjoint_gradient_computation/6_Adjoint_gradient_computation.ipynb @@ -15,6 +15,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -68,11 +69,13 @@ "metadata": {}, "outputs": [], "source": [ - "from braket.devices import Devices\n", + "import time\n", + "\n", "import pennylane as qml\n", - "from pennylane import qchem\n", "from pennylane import numpy as np\n", - "import time" + "from pennylane import qchem\n", + "\n", + "from braket.devices import Devices" ] }, { @@ -98,17 +101,17 @@ } ], "source": [ - "n_electrons = 8\n", - "symbols, coordinates = qchem.read_structure('qchem/co2.xyz')\n", "# suppress a HDF5 warning\n", "import warnings\n", + "\n", + "n_electrons = 8\n", + "symbols, coordinates = qchem.read_structure(\"qchem/co2.xyz\")\n", + "\n", "with warnings.catch_warnings():\n", - " warnings.simplefilter('ignore')\n", - " H, qubits = qchem.molecular_hamiltonian(symbols,\n", - " coordinates,\n", - " method=\"pyscf\",\n", - " active_electrons=n_electrons,\n", - " name=\"co2\")\n", + " warnings.simplefilter(\"ignore\")\n", + " H, qubits = qchem.molecular_hamiltonian(\n", + " symbols, coordinates, method=\"pyscf\", active_electrons=n_electrons, name=\"co2\"\n", + " )\n", "print(f\"Number of qubits: {qubits}\")" ] }, @@ -193,7 +196,7 @@ "# set the device and differentiation method\n", "device_arn = Devices.Amazon.SV1\n", "dev = qml.device(\"braket.aws.qubit\", device_arn=device_arn, wires=qubits, shots=0)\n", - "diff_method = 'device'" + "diff_method = \"device\"" ] }, { @@ -267,7 +270,9 @@ "\n", "adjoint_doubles_stop = time.time()\n", "adjoint_doubles_time = adjoint_doubles_stop - adjoint_doubles_start\n", - "print(f\"Time to compute all double excitation derivatives with adjoint differentiation: {adjoint_doubles_time}\")" + "print(\n", + " f\"Time to compute all double excitation derivatives with adjoint differentiation: {adjoint_doubles_time}\"\n", + ")" ] }, { @@ -357,7 +362,7 @@ } ], "source": [ - "stepsize=0.4\n", + "stepsize = 0.4\n", "\n", "opt = qml.GradientDescentOptimizer(stepsize=stepsize)\n", "iterations = 10\n", @@ -436,11 +441,15 @@ "\n", "adjoint_singles_start = time.time()\n", "\n", - "singles_grads = circuit_gradient(params, excitations=singles, gates_select=doubles_select, params_select=params_doubles)\n", + "singles_grads = circuit_gradient(\n", + " params, excitations=singles, gates_select=doubles_select, params_select=params_doubles\n", + ")\n", "\n", "adjoint_singles_stop = time.time()\n", "adjoint_singles_time = adjoint_singles_stop - adjoint_singles_start\n", - "print(f\"Time to compute all singles derivatives with adjoint differentiation: {adjoint_singles_time}\")" + "print(\n", + " f\"Time to compute all singles derivatives with adjoint differentiation: {adjoint_singles_time}\"\n", + ")" ] }, { @@ -546,7 +555,7 @@ "for n in range(iterations):\n", " print(f\"Iteration {n} of full optimization.\")\n", " params, energy = opt.step_and_cost(circuit_1, params, excitations=gates_select)\n", - " best_energy=energy.numpy()\n" + " best_energy = energy.numpy()" ] }, { @@ -625,7 +634,7 @@ "metadata": {}, "outputs": [], "source": [ - "diff_method = 'parameter-shift'\n", + "diff_method = \"parameter-shift\"\n", "doubles_count = min(35, len(doubles))\n", "doubles_ps = doubles[:doubles_count]" ] @@ -684,7 +693,9 @@ "\n", "doubles_ps_unbatched_stop = time.time()\n", "doubles_ps_unbatched_time = doubles_ps_unbatched_stop - doubles_ps_unbatched_start\n", - "print(f\"Time to compute {doubles_count} double excitation derivatives using unbatched parameter shift: {doubles_ps_unbatched_time}\")" + "print(\n", + " f\"Time to compute {doubles_count} double excitation derivatives using unbatched parameter shift: {doubles_ps_unbatched_time}\"\n", + ")" ] }, { @@ -716,8 +727,10 @@ " shots=0,\n", " parallel=True,\n", ")\n", + "\n", + "\n", "@qml.qnode(dev_parallel, diff_method=diff_method)\n", - "def circuit_1_ps_parallel(params, excitations): # must redefine due to new device\n", + "def circuit_1_ps_parallel(params, excitations): # must redefine due to new device\n", " qml.BasisState(hf_state, wires=H.wires)\n", " for i, excitation in enumerate(excitations):\n", " if len(excitation) == 4:\n", @@ -756,7 +769,9 @@ "\n", "doubles_ps_batched_stop = time.time()\n", "doubles_ps_batched_time = doubles_ps_batched_stop - doubles_ps_batched_start\n", - "print(f\"Time to compute {doubles_count} double excitation derivatives using batched parameter shift: {doubles_ps_batched_time}\")" + "print(\n", + " f\"Time to compute {doubles_count} double excitation derivatives using batched parameter shift: {doubles_ps_batched_time}\"\n", + ")" ] }, { @@ -773,8 +788,10 @@ } ], "source": [ - "extrapolated_unbatched_ps_time = doubles_ps_unbatched_time * (len(doubles)/doubles_count)\n", - "print(f\"Extrapolated time to compute all doubles derivatives with unbatched parameter shift: {extrapolated_unbatched_ps_time}\")" + "extrapolated_unbatched_ps_time = doubles_ps_unbatched_time * (len(doubles) / doubles_count)\n", + "print(\n", + " f\"Extrapolated time to compute all doubles derivatives with unbatched parameter shift: {extrapolated_unbatched_ps_time}\"\n", + ")" ] }, { @@ -791,8 +808,10 @@ } ], "source": [ - "extrapolated_batched_ps_time = doubles_ps_batched_time * (len(doubles)/doubles_count)\n", - "print(f\"Extrapolated time to compute all doubles derivatives with batched parameter shift: {extrapolated_batched_ps_time}\")" + "extrapolated_batched_ps_time = doubles_ps_batched_time * (len(doubles) / doubles_count)\n", + "print(\n", + " f\"Extrapolated time to compute all doubles derivatives with batched parameter shift: {extrapolated_batched_ps_time}\"\n", + ")" ] }, { @@ -818,7 +837,9 @@ ], "source": [ "adjoint_vs_unbatched_ps = extrapolated_unbatched_ps_time / adjoint_doubles_time\n", - "print(f\"Time to compute all doubles derivatives:\\nRatio of (extrapolated) unbatched parameter shift time to adjoint time: {adjoint_vs_unbatched_ps}\")" + "print(\n", + " f\"Time to compute all doubles derivatives:\\nRatio of (extrapolated) unbatched parameter shift time to adjoint time: {adjoint_vs_unbatched_ps}\"\n", + ")" ] }, { @@ -837,7 +858,9 @@ ], "source": [ "adjoint_vs_batched_ps = extrapolated_batched_ps_time / adjoint_doubles_time\n", - "print(f\"Time to compute all doubles derivatives:\\nRatio of (extrapolated) batched parameter shift time to adjoint time: {adjoint_vs_batched_ps}\")" + "print(\n", + " f\"Time to compute all doubles derivatives:\\nRatio of (extrapolated) batched parameter shift time to adjoint time: {adjoint_vs_batched_ps}\"\n", + ")" ] }, { @@ -930,8 +953,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] } ], diff --git a/examples/pulse_control/1_Bringup_experiments.ipynb b/examples/pulse_control/1_Bringup_experiments.ipynb index 1509138d4..43cde489b 100644 --- a/examples/pulse_control/1_Bringup_experiments.ipynb +++ b/examples/pulse_control/1_Bringup_experiments.ipynb @@ -22,6 +22,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -41,16 +42,17 @@ "source": [ "%matplotlib inline\n", "\n", - "from braket.aws import AwsDevice\n", - "from braket.devices import Devices\n", - "from braket.pulse import PulseSequence, GaussianWaveform, ConstantWaveform\n", - "from braket.parametric import FreeParameter\n", + "import matplotlib.pyplot as plt\n", "\n", "## Imports for function fitting\n", "import numpy as np\n", - "import matplotlib.pyplot as plt\n", "import scipy.optimize\n", - "from scipy.fft import fft, fftfreq" + "from scipy.fft import fft, fftfreq\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.devices import Devices\n", + "from braket.parametric import FreeParameter\n", + "from braket.pulse import GaussianWaveform, PulseSequence" ] }, { @@ -76,7 +78,9 @@ " \"drive_frame\": \"Transmon_3_charge_tx\",\n", " \"readout_frame\": \"Transmon_3_readout_rx\",\n", " \"spectroscopy_wf\": GaussianWaveform(100e-9, 25e-9, 0.1, True),\n", - " \"rabi_wf\": GaussianWaveform(FreeParameter(\"length\"), FreeParameter(\"length\") * 0.25, 0.2, True)\n", + " \"rabi_wf\": GaussianWaveform(\n", + " FreeParameter(\"length\"), FreeParameter(\"length\") * 0.25, 0.2, True\n", + " ),\n", " },\n", "}" ] @@ -171,7 +175,7 @@ "source": [ "frequency = FreeParameter(\"frequency\")\n", "\n", - "pulse_sequence = ( \n", + "pulse_sequence = (\n", " PulseSequence()\n", " .set_frequency(drive_frame, frequency)\n", " .play(drive_frame, waveform)\n", @@ -198,7 +202,9 @@ "span = 75e6\n", "N_steps = 25\n", "N_shots = 100\n", - "frequencies = np.linspace(drive_frame.frequency-span/2, drive_frame.frequency+span/2, N_steps)\n", + "frequencies = np.linspace(\n", + " drive_frame.frequency - span / 2, drive_frame.frequency + span / 2, N_steps\n", + ")\n", "\n", "qubit_spectroscopy_sequences = [pulse_sequence(frequency=frequency) for frequency in frequencies]\n", "batch = device.run_batch(qubit_spectroscopy_sequences, shots=N_shots)" @@ -219,7 +225,7 @@ "outputs": [], "source": [ "def resonance_fit(x, A, A0, w, x0):\n", - " return A0-A*np.exp(-(x-x0)**2/w**2)" + " return A0 - A * np.exp(-((x - x0) ** 2) / w**2)" ] }, { @@ -257,24 +263,24 @@ } ], "source": [ - "probability_of_zero = [result.measurement_counts['0']/N_shots for result in batch.results()]\n", + "probability_of_zero = [result.measurement_counts[\"0\"] / N_shots for result in batch.results()]\n", "\n", "x, y = frequencies, probability_of_zero\n", "\n", - "initial_guess=[1/2, 1, 10e6, drive_frame.frequency] # Amplitude, Offset, width, centerFrequency\n", + "initial_guess = [1 / 2, 1, 10e6, drive_frame.frequency] # Amplitude, Offset, width, centerFrequency\n", "optimal_params, _ = scipy.optimize.curve_fit(resonance_fit, x, y, p0=initial_guess)\n", - "x_fit = np.arange(x[0],x[-1], np.diff(x)[0]/10)\n", + "x_fit = np.arange(x[0], x[-1], np.diff(x)[0] / 10)\n", "y_fit = resonance_fit(x_fit, *optimal_params)\n", "\n", "plt.figure()\n", - "plt.plot(x,y, 'o')\n", - "plt.plot(x_fit,y_fit)\n", + "plt.plot(x, y, \"o\")\n", + "plt.plot(x_fit, y_fit)\n", "plt.xlabel(\"Frequency (Hz)\")\n", "plt.ylabel(\"Population\")\n", "plt.vlines(drive_frame.frequency, min(y_fit), 1)\n", "resonance_frequency = optimal_params[3]\n", - "print('Expected resonance frequency:', round(drive_frame.frequency*1e-6,2), 'GHz')\n", - "print('Measured resonance frequency:', round(resonance_frequency*1e-6,2), 'GHz')" + "print(\"Expected resonance frequency:\", round(drive_frame.frequency * 1e-6, 2), \"GHz\")\n", + "print(\"Measured resonance frequency:\", round(resonance_frequency * 1e-6, 2), \"GHz\")" ] }, { @@ -299,7 +305,7 @@ "source": [ "waveform = experiment_configuration[device_name][\"rabi_wf\"]\n", "\n", - "rabi_sequence = ( \n", + "rabi_sequence = (\n", " PulseSequence()\n", " .set_frequency(drive_frame, drive_frame.frequency)\n", " .play(drive_frame, waveform)\n", @@ -323,8 +329,8 @@ "metadata": {}, "outputs": [], "source": [ - "start_length=12e-9\n", - "end_length=2e-7\n", + "start_length = 12e-9\n", + "end_length = 2e-7\n", "lengths = np.arange(start_length, end_length, 12e-9)\n", "N_shots = 100\n", "\n", @@ -350,11 +356,12 @@ "outputs": [], "source": [ "def damped_oscillation_fit(x, A, A0, Tau, f, x0):\n", - " return A*np.exp(-x/Tau)*np.cos(2*np.pi*(x-x0)*f)+A0\n", + " return A * np.exp(-x / Tau) * np.cos(2 * np.pi * (x - x0) * f) + A0\n", + "\n", "\n", "def estimate_fit_parameters(x, y):\n", " signal_mean = np.mean(y)\n", - " idx_max=np.argmax(np.abs(fft(y-np.mean(y))))\n", + " idx_max = np.argmax(np.abs(fft(y - np.mean(y))))\n", " oscillation_frequency_estimate = fftfreq(len(x), np.diff(x)[0])[idx_max]\n", "\n", " return signal_mean, oscillation_frequency_estimate" @@ -395,34 +402,34 @@ } ], "source": [ - "probability_of_zero = [result.measurement_counts['0']/N_shots for result in batch.results()]\n", + "probability_of_zero = [result.measurement_counts[\"0\"] / N_shots for result in batch.results()]\n", "x, y = lengths, probability_of_zero\n", "\n", - "signal_mean, oscillation_frequency_estimate = estimate_fit_parameters(x,y)\n", + "signal_mean, oscillation_frequency_estimate = estimate_fit_parameters(x, y)\n", "\n", - "initial_guess=[1/2, signal_mean, 8e-6, oscillation_frequency_estimate, 0]\n", + "initial_guess = [1 / 2, signal_mean, 8e-6, oscillation_frequency_estimate, 0]\n", "optimal_params, _ = scipy.optimize.curve_fit(damped_oscillation_fit, x, y, p0=initial_guess)\n", - "x_fit = np.arange(x[0],x[-1], np.diff(x)[0]/10)\n", + "x_fit = np.arange(x[0], x[-1], np.diff(x)[0] / 10)\n", "y_fit = damped_oscillation_fit(x_fit, *optimal_params)\n", "\n", - "plt.plot(x,y, 'o')\n", - "plt.plot(x_fit,y_fit)\n", + "plt.plot(x, y, \"o\")\n", + "plt.plot(x_fit, y_fit)\n", "plt.xlabel(\"Pulse duration (s)\")\n", "plt.ylabel(\"Population\")\n", "\n", "\n", "rabi_frequency = optimal_params[3]\n", "phase_offset = optimal_params[4]\n", - "x90_duration=(np.pi/2)/(2*np.pi*rabi_frequency)+phase_offset\n", - "plt.plot(x90_duration, damped_oscillation_fit(x90_duration, *optimal_params), 'ks')\n", + "x90_duration = (np.pi / 2) / (2 * np.pi * rabi_frequency) + phase_offset\n", + "plt.plot(x90_duration, damped_oscillation_fit(x90_duration, *optimal_params), \"ks\")\n", "\n", - "print('Rabi frequency:', round(rabi_frequency*1e-6, 2), ' MHz')\n", - "print('rx(pi/2) length: ', round(x90_duration*1e9, 2), ' ns')\n", + "print(\"Rabi frequency:\", round(rabi_frequency * 1e-6, 2), \" MHz\")\n", + "print(\"rx(pi/2) length: \", round(x90_duration * 1e9, 2), \" ns\")\n", "\n", "# Pulse duration must be a multiple of 4ns\n", - "x90_duration=x90_duration//4e-9*4e-9\n", - "plt.plot(x90_duration, damped_oscillation_fit(x90_duration, *optimal_params), 'rs')\n", - "print('Redefined rx(pi/2) length: ', round(x90_duration*1e9, 0), ' ns')" + "x90_duration = x90_duration // 4e-9 * 4e-9\n", + "plt.plot(x90_duration, damped_oscillation_fit(x90_duration, *optimal_params), \"rs\")\n", + "print(\"Redefined rx(pi/2) length: \", round(x90_duration * 1e9, 0), \" ns\")" ] }, { @@ -431,7 +438,9 @@ "metadata": {}, "outputs": [], "source": [ - "experiment_configuration[device_name][\"x90_wf\"] = GaussianWaveform(x90_duration, x90_duration/4, 0.2, True)" + "experiment_configuration[device_name][\"x90_wf\"] = GaussianWaveform(\n", + " x90_duration, x90_duration / 4, 0.2, True\n", + ")" ] }, { @@ -458,11 +467,11 @@ "metadata": {}, "outputs": [], "source": [ - "detuning=250e3\n", + "detuning = 250e3\n", "x90 = experiment_configuration[device_name][\"x90_wf\"]\n", "\n", "delay_sec = FreeParameter(\"delay_sec\")\n", - "ramsey_spectroscopy = ( \n", + "ramsey_spectroscopy = (\n", " PulseSequence()\n", " .set_frequency(drive_frame, drive_frame.frequency - detuning)\n", " .play(drive_frame, x90)\n", @@ -486,10 +495,10 @@ "metadata": {}, "outputs": [], "source": [ - "start_delay=12e-9\n", - "end_delay=40000e-9\n", + "start_delay = 12e-9\n", + "end_delay = 40000e-9\n", "delays = np.arange(start_delay, end_delay, 512e-9)\n", - "N_shots=100\n", + "N_shots = 100\n", "\n", "pulse_sequences = [ramsey_spectroscopy(delay_sec=delay) for delay in delays]\n", "\n", @@ -529,21 +538,21 @@ } ], "source": [ - "probability_of_zero = [result.measurement_counts['0']/N_shots for result in batch.results()]\n", + "probability_of_zero = [result.measurement_counts[\"0\"] / N_shots for result in batch.results()]\n", "x, y = delays, probability_of_zero\n", - "plt.plot(x,y, 'o-')\n", + "plt.plot(x, y, \"o-\")\n", "\n", - "signal_mean, oscillation_frequency_estimate = estimate_fit_parameters(x,y)\n", - "initial_guess=[0.5, signal_mean, 2e-5, oscillation_frequency_estimate, 0]\n", + "signal_mean, oscillation_frequency_estimate = estimate_fit_parameters(x, y)\n", + "initial_guess = [0.5, signal_mean, 2e-5, oscillation_frequency_estimate, 0]\n", "\n", "optimal_params, _ = scipy.optimize.curve_fit(damped_oscillation_fit, x, y, p0=initial_guess)\n", - "x_fit = np.arange(x[0],x[-1], np.diff(x)[0]/10)\n", + "x_fit = np.arange(x[0], x[-1], np.diff(x)[0] / 10)\n", "y_fit = damped_oscillation_fit(x_fit, *optimal_params)\n", - "plt.plot(x_fit,y_fit)\n", + "plt.plot(x_fit, y_fit)\n", "plt.xlabel(\"Delay (s)\")\n", "plt.ylabel(\"Population\")\n", - "print('Detuning:', round(optimal_params[3]*1e-3, 2), ' kHz')\n", - "print('T2: ', round(np.abs(optimal_params[2])*1e6, 2), ' us')" + "print(\"Detuning:\", round(optimal_params[3] * 1e-3, 2), \" kHz\")\n", + "print(\"T2: \", round(np.abs(optimal_params[2]) * 1e6, 2), \" us\")" ] }, { @@ -565,8 +574,12 @@ "source": [ "print(\"Qauntum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] }, { diff --git a/examples/pulse_control/2_Native_gate_calibrations.ipynb b/examples/pulse_control/2_Native_gate_calibrations.ipynb index a975945b3..62f37786d 100644 --- a/examples/pulse_control/2_Native_gate_calibrations.ipynb +++ b/examples/pulse_control/2_Native_gate_calibrations.ipynb @@ -37,17 +37,18 @@ "source": [ "%matplotlib inline\n", "\n", + "import math\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from utils.draw_pulse_sequence import draw\n", + "\n", "from braket.aws import AwsDevice\n", - "from braket.devices import Devices\n", - "from braket.parametric import FreeParameter\n", - "from braket.pulse import PulseSequence\n", "from braket.circuits import Circuit, GateCalibrations, QubitSet\n", - "from braket.circuits.gates import Rx, Rz, CZ\n", + "from braket.circuits.gates import CZ, Rx, Rz\n", "from braket.circuits.serialization import IRType\n", - "\n", - "import math\n", - "from utils.draw_pulse_sequence import draw\n", - "import matplotlib.pyplot as plt" + "from braket.devices import Devices\n", + "from braket.parametric import FreeParameter\n", + "from braket.pulse import PulseSequence" ] }, { @@ -64,7 +65,7 @@ "metadata": {}, "outputs": [], "source": [ - "device = AwsDevice(Devices.Rigetti.Ankaa2)\n" + "device = AwsDevice(Devices.Rigetti.Ankaa2)" ] }, { @@ -90,9 +91,7 @@ ], "source": [ "calibrations = device.gate_calibrations\n", - "print(\n", - " f\"The number of pulse implementations in the calibration file is {len(calibrations)}.\"\n", - ")" + "print(f\"The number of pulse implementations in the calibration file is {len(calibrations)}.\")" ] }, { @@ -109,7 +108,7 @@ "metadata": {}, "outputs": [], "source": [ - "calibrations = device.refresh_gate_calibrations()\n" + "calibrations = device.refresh_gate_calibrations()" ] }, { @@ -142,22 +141,21 @@ "\n", "a = 30\n", "b = 37\n", - "pulse_sequence_rz_theta_q30 = calibrations.pulse_sequences[\n", - " (rz_theta, QubitSet([a]))\n", - "]\n", - "pulse_sequence_rx_pi_2_q30 = calibrations.pulse_sequences[\n", - " (rx_pi_2, QubitSet([a]))\n", - "]\n", - "pulse_sequence_cz_q30 = calibrations.pulse_sequences[\n", - " (cz, QubitSet([a, b]))\n", - "]\n", + "pulse_sequence_rz_theta_q30 = calibrations.pulse_sequences[(rz_theta, QubitSet([a]))]\n", + "pulse_sequence_rx_pi_2_q30 = calibrations.pulse_sequences[(rx_pi_2, QubitSet([a]))]\n", + "pulse_sequence_cz_q30 = calibrations.pulse_sequences[(cz, QubitSet([a, b]))]\n", "\n", "print(\n", - " '\\n'.join([\n", - " \"The Rz pulse sequence is parametrized by the following parameter(s):\" +str(pulse_sequence_rz_theta_q30.parameters),\n", - " \"The Rx(pi/2) pulse sequence is parametrized by the following parameter(s):\" +str(pulse_sequence_rx_pi_2_q30.parameters),\n", - " \"The CZ pulse sequence is parametrized by the following parameter(s):\" +str(pulse_sequence_cz_q30.parameters),\n", - " ])\n", + " \"\\n\".join(\n", + " [\n", + " \"The Rz pulse sequence is parametrized by the following parameter(s):\"\n", + " + str(pulse_sequence_rz_theta_q30.parameters),\n", + " \"The Rx(pi/2) pulse sequence is parametrized by the following parameter(s):\"\n", + " + str(pulse_sequence_rx_pi_2_q30.parameters),\n", + " \"The CZ pulse sequence is parametrized by the following parameter(s):\"\n", + " + str(pulse_sequence_cz_q30.parameters),\n", + " ]\n", + " )\n", ")" ] }, @@ -185,8 +183,8 @@ } ], "source": [ - "pulse_sequence_rz_theta_q30_theta0 = pulse_sequence_rz_theta_q30(theta=math.pi/8)\n", - "print(pulse_sequence_rz_theta_q30_theta0.to_ir())\n" + "pulse_sequence_rz_theta_q30_theta0 = pulse_sequence_rz_theta_q30(theta=math.pi / 8)\n", + "print(pulse_sequence_rz_theta_q30_theta0.to_ir())" ] }, { @@ -266,7 +264,7 @@ ], "source": [ "pulse_sequence_rx_pi_2_q30 = calibrations.pulse_sequences[(rx_pi_2, QubitSet(a))]\n", - "draw(pulse_sequence_rx_pi_2_q30)\n" + "draw(pulse_sequence_rx_pi_2_q30)" ] }, { @@ -328,9 +326,7 @@ } ], "source": [ - "bell_circuit = (\n", - " Circuit().rx(a, math.pi / 2).rx(b, math.pi / 2).cz(a, b).rx(b, -math.pi / 2)\n", - ")\n", + "bell_circuit = Circuit().rx(a, math.pi / 2).rx(b, math.pi / 2).cz(a, b).rx(b, -math.pi / 2)\n", "print(bell_circuit)" ] }, @@ -412,9 +408,7 @@ } ], "source": [ - "custom_calibration = GateCalibrations(\n", - " {(Rx(math.pi / 2), QubitSet(a)): pulse_sequence_rx_pi_2_q30}\n", - ")\n", + "custom_calibration = GateCalibrations({(Rx(math.pi / 2), QubitSet(a)): pulse_sequence_rx_pi_2_q30})\n", "task = device.run(\n", " bell_circuit,\n", " gate_definitions=custom_calibration.pulse_sequences,\n", @@ -466,9 +460,7 @@ ], "source": [ "print(\n", - " bell_circuit.to_ir(\n", - " IRType.OPENQASM, gate_definitions=custom_calibration.pulse_sequences\n", - " ).source\n", + " bell_circuit.to_ir(IRType.OPENQASM, gate_definitions=custom_calibration.pulse_sequences).source\n", ")" ] }, @@ -531,9 +523,7 @@ ")\n", "\n", "parametric_circuit = Circuit().pulse_gate(0, U_sequence)\n", - "task = device.run(\n", - " parametric_circuit(theta=math.pi / 2, phi=0, lambda_=0), shots=nb_shots\n", - ")\n", + "task = device.run(parametric_circuit(theta=math.pi / 2, phi=0, lambda_=0), shots=nb_shots)\n", "\n", "counts = task.result().measurement_counts\n", "plt.bar(sorted(counts), [counts[k] / nb_shots for k in sorted(counts)])\n", diff --git a/examples/pulse_control/3_Bell_pair_with_pulses_Rigetti.ipynb b/examples/pulse_control/3_Bell_pair_with_pulses_Rigetti.ipynb index 4e9e06053..ecd9c666e 100644 --- a/examples/pulse_control/3_Bell_pair_with_pulses_Rigetti.ipynb +++ b/examples/pulse_control/3_Bell_pair_with_pulses_Rigetti.ipynb @@ -20,6 +20,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -38,19 +39,15 @@ "outputs": [], "source": [ "%matplotlib inline\n", - "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from utils.draw_pulse_sequence import draw_multiple_frames, draw_waveform\n", "\n", + "import braket.circuits.circuit as circuit\n", "from braket.aws import AwsDevice\n", - "from braket.devices import Devices\n", - "from braket.pulse import PulseSequence\n", - "\n", "from braket.circuits import Circuit, QubitSet\n", - "import braket.circuits.circuit as circuit\n", "from braket.circuits.gates import CZ\n", - "\n", - "from utils.draw_pulse_sequence import draw_waveform, draw_multiple_frames\n", - "from utils.extract_phases import extract_phases" + "from braket.devices import Devices" ] }, { @@ -67,8 +64,8 @@ "metadata": {}, "outputs": [], "source": [ - "a=30\n", - "b=37\n", + "a = 30\n", + "b = 37\n", "\n", "device = AwsDevice(Devices.Rigetti.Ankaa2)" ] @@ -160,9 +157,9 @@ ], "source": [ "nb_shots = 100\n", - "task = device.run(bell_pair_with_gates, shots = nb_shots, disable_qubit_rewiring=True)\n", + "task = device.run(bell_pair_with_gates, shots=nb_shots, disable_qubit_rewiring=True)\n", "counts = task.result().measurement_counts\n", - "plt.bar(sorted(counts), [counts[k]/nb_shots for k in sorted(counts)])\n", + "plt.bar(sorted(counts), [counts[k] / nb_shots for k in sorted(counts)])\n", "plt.xlabel(\"State\")\n", "plt.ylabel(\"Population\")" ] @@ -205,14 +202,9 @@ "source": [ "@circuit.subroutine(register=True)\n", "def rigetti_native_h(q0):\n", - " return (\n", - " Circuit()\n", - " .rz(q0, np.pi)\n", - " .rx(q0, np.pi/2)\n", - " .rz(q0, np.pi/2)\n", - " .rx(q0, -np.pi/2)\n", - " )\n", - " \n", + " return Circuit().rz(q0, np.pi).rx(q0, np.pi / 2).rz(q0, np.pi / 2).rx(q0, -np.pi / 2)\n", + "\n", + "\n", "print(Circuit().rigetti_native_h(a))" ] }, @@ -312,10 +304,10 @@ "waveform_name = list(a_b_cz._waveforms.keys())[0]\n", "\n", "a_b_cz_wfm = a_b_cz_wfms[waveform_name]\n", - "a_b_cz_frame = device.frames['Transmon_144_flux_tx_b']\n", - "dt=a_b_cz_frame.port.dt\n", + "a_b_cz_frame = device.frames[\"Transmon_144_flux_tx_b\"]\n", + "dt = a_b_cz_frame.port.dt\n", "\n", - "print('CZ pulse duration:', round(a_b_cz_wfm.length * 1e9,0), 'ns')" + "print(\"CZ pulse duration:\", round(a_b_cz_wfm.length * 1e9, 0), \"ns\")" ] }, { @@ -436,11 +428,7 @@ ], "source": [ "bell_pair_with_pulse = (\n", - " Circuit()\n", - " .rigetti_native_h(a)\n", - " .rigetti_native_h(b)\n", - " .pulse_gate([a, b], a_b_cz)\n", - " .rigetti_native_h(b)\n", + " Circuit().rigetti_native_h(a).rigetti_native_h(b).pulse_gate([a, b], a_b_cz).rigetti_native_h(b)\n", ")\n", "print(bell_pair_with_pulse)" ] @@ -485,7 +473,7 @@ "nb_shots = 500\n", "task = device.run(bell_pair_with_pulse, shots=nb_shots, disable_qubit_rewiring=True)\n", "counts = task.result().measurement_counts\n", - "plt.bar(sorted(counts), [counts[k]/nb_shots for k in sorted(counts)])\n", + "plt.bar(sorted(counts), [counts[k] / nb_shots for k in sorted(counts)])\n", "plt.xlabel(\"State\")\n", "plt.ylabel(\"Population\")" ] @@ -509,8 +497,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] }, { diff --git a/examples/pulse_control/4_Build_single_qubit_gates.ipynb b/examples/pulse_control/4_Build_single_qubit_gates.ipynb index d2369e256..dfa7d417a 100644 --- a/examples/pulse_control/4_Build_single_qubit_gates.ipynb +++ b/examples/pulse_control/4_Build_single_qubit_gates.ipynb @@ -22,6 +22,7 @@ "source": [ "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", "from braket.tracking import Tracker\n", + "\n", "t = Tracker().start()" ] }, @@ -41,18 +42,18 @@ "source": [ "%matplotlib inline\n", "\n", - "from braket.aws import AwsDevice\n", - "from braket.devices import Devices\n", - "from braket.pulse import PulseSequence, GaussianWaveform, DragGaussianWaveform\n", - "from braket.parametric import FreeParameter\n", - "from braket.circuits import Circuit, circuit\n", - "\n", - "from utils.draw_pulse_sequence import draw\n", + "import matplotlib.pyplot as plt\n", "\n", "## Imports for function fitting\n", "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import scipy.optimize" + "import scipy.optimize\n", + "from utils.draw_pulse_sequence import draw\n", + "\n", + "from braket.aws import AwsDevice\n", + "from braket.circuits import Circuit, circuit\n", + "from braket.devices import Devices\n", + "from braket.parametric import FreeParameter\n", + "from braket.pulse import GaussianWaveform, PulseSequence" ] }, { @@ -113,11 +114,7 @@ "length = 40e-9\n", "waveform = GaussianWaveform(length, width, FreeParameter(\"amplitude\"), False)\n", "\n", - "rabi_sequence = ( \n", - " PulseSequence()\n", - " .play(drive_frame, waveform)\n", - " .capture_v0(readout_frame)\n", - ")" + "rabi_sequence = PulseSequence().play(drive_frame, waveform).capture_v0(readout_frame)" ] }, { @@ -134,8 +131,8 @@ "metadata": {}, "outputs": [], "source": [ - "start_amp=0.01\n", - "end_amp=0.75\n", + "start_amp = 0.01\n", + "end_amp = 0.75\n", "amps = np.arange(start_amp, end_amp, 0.02)\n", "N_shots = 1000\n", "\n", @@ -177,28 +174,28 @@ ], "source": [ "def damped_oscillation_fit(x, A, A0, Tau, f, x0):\n", - " return A*np.exp(-x/Tau)*np.cos(2*np.pi*(x-x0)*f)+A0\n", + " return A * np.exp(-x / Tau) * np.cos(2 * np.pi * (x - x0) * f) + A0\n", + "\n", "\n", - "population = [result.measurement_counts['0']/N_shots for result in batch.results()]\n", + "population = [result.measurement_counts[\"0\"] / N_shots for result in batch.results()]\n", "x, y = amps, population\n", "\n", - "initial_guess=[0.5, 0.5, 1, 0.4, 0]\n", + "initial_guess = [0.5, 0.5, 1, 0.4, 0]\n", "optimal_params, _ = scipy.optimize.curve_fit(damped_oscillation_fit, x, y, p0=initial_guess)\n", - "x_fit = np.arange(x[0],x[-1], np.diff(x)[0]/10)\n", + "x_fit = np.arange(x[0], x[-1], np.diff(x)[0] / 10)\n", "y_fit = damped_oscillation_fit(x_fit, *optimal_params)\n", "\n", - "plt.plot(x,y, 'o')\n", - "plt.plot(x_fit,y_fit)\n", + "plt.plot(x, y, \"o\")\n", + "plt.plot(x_fit, y_fit)\n", "plt.xlabel(\"Pulse width (s)\")\n", "plt.ylabel(\"Population\")\n", "\n", "frequency = optimal_params[3]\n", "phase_offset = optimal_params[4]\n", - "x90_amplitude=(np.pi/2)/(2*np.pi*frequency)+phase_offset\n", - "plt.plot(x90_amplitude, damped_oscillation_fit(x90_amplitude, *optimal_params), 'ks')\n", + "x90_amplitude = (np.pi / 2) / (2 * np.pi * frequency) + phase_offset\n", + "plt.plot(x90_amplitude, damped_oscillation_fit(x90_amplitude, *optimal_params), \"ks\")\n", "\n", - "print('rx(pi/2) amplitude: ', round(x90_amplitude, 5), ' ns')\n", - "\n" + "print(\"rx(pi/2) amplitude: \", round(x90_amplitude, 5), \" ns\")" ] }, { @@ -263,11 +260,11 @@ "\n", "U_sequence = (\n", " PulseSequence()\n", - " .shift_phase(drive_frame, np.pi/2 - lambda_)\n", + " .shift_phase(drive_frame, np.pi / 2 - lambda_)\n", " .play(drive_frame, x90)\n", " .shift_phase(drive_frame, theta - np.pi)\n", " .play(drive_frame, x90)\n", - " .shift_phase(drive_frame, np.pi/2 - phi)\n", + " .shift_phase(drive_frame, np.pi / 2 - phi)\n", ")" ] }, @@ -288,7 +285,7 @@ } ], "source": [ - "draw(U_sequence(theta=np.pi/2, phi=0, lambda_=np.pi))" + "draw(U_sequence(theta=np.pi / 2, phi=0, lambda_=np.pi))" ] }, { @@ -311,12 +308,8 @@ "source": [ "@circuit.subroutine(register=True)\n", "def U_pulses(theta, phi, lambda_):\n", - " return (\n", - " Circuit()\n", - " .pulse_gate(\n", - " [qubit], \n", - " pulse_sequence=U_sequence(theta=theta, phi=phi, lambda_=lambda_)\n", - " )\n", + " return Circuit().pulse_gate(\n", + " [qubit], pulse_sequence=U_sequence(theta=theta, phi=phi, lambda_=lambda_)\n", " )" ] }, @@ -326,14 +319,22 @@ "metadata": {}, "outputs": [], "source": [ - "nb_shots=500\n", - "thetas=np.linspace(0, 2*np.pi, 25)\n", + "nb_shots = 500\n", + "thetas = np.linspace(0, 2 * np.pi, 25)\n", "\n", "# initialization along the X axis\n", - "b_X=device.run_batch([Circuit().rx(4, np.pi/2).rz(4, np.pi/2).U_pulses(t, 0, 0) for t in thetas], shots=nb_shots, disable_qubit_rewiring=True)\n", + "b_X = device.run_batch(\n", + " [Circuit().rx(4, np.pi / 2).rz(4, np.pi / 2).U_pulses(t, 0, 0) for t in thetas],\n", + " shots=nb_shots,\n", + " disable_qubit_rewiring=True,\n", + ")\n", "\n", "# initialization along the Y axis\n", - "b_Y=device.run_batch([Circuit().rx(4, np.pi/2).U_pulses(t, 0, 0) for t in thetas], shots=nb_shots, disable_qubit_rewiring=True)" + "b_Y = device.run_batch(\n", + " [Circuit().rx(4, np.pi / 2).U_pulses(t, 0, 0) for t in thetas],\n", + " shots=nb_shots,\n", + " disable_qubit_rewiring=True,\n", + ")" ] }, { @@ -363,10 +364,10 @@ } ], "source": [ - "population_init_X = [result.measurement_counts['0']/nb_shots for result in b_X.results()]\n", + "population_init_X = [result.measurement_counts[\"0\"] / nb_shots for result in b_X.results()]\n", "plt.plot(thetas, population_init_X, label=\"Init along X\")\n", "\n", - "population_init_Y = [result.measurement_counts['0']/nb_shots for result in b_Y.results()]\n", + "population_init_Y = [result.measurement_counts[\"0\"] / nb_shots for result in b_Y.results()]\n", "plt.plot(thetas, population_init_Y, label=\"Init along Y\")\n", "\n", "plt.xlabel(\"Angle (rad)\")\n", @@ -407,11 +408,11 @@ "metadata": {}, "outputs": [], "source": [ - "single_x90_sequence = ( \n", + "single_x90_sequence = (\n", " PulseSequence()\n", - " .shift_phase(drive_frame, np.pi/2 - lambda_)\n", + " .shift_phase(drive_frame, np.pi / 2 - lambda_)\n", " .play(drive_frame, x90)\n", - " .shift_phase(drive_frame, - phi - np.pi/2)\n", + " .shift_phase(drive_frame, -phi - np.pi / 2)\n", ")" ] }, @@ -446,14 +447,20 @@ " f.subplots_adjust(hspace=0)\n", "\n", " ax[0].set_title(frame_id)\n", - " ax[0].plot(data.amplitudes[frame_id].times(), np.real(data.amplitudes[frame_id].values()), label=\"Real\")\n", - " ax[0].plot(data.amplitudes[frame_id].times(), np.imag(data.amplitudes[frame_id].values()), label=\"Imag\")\n", + " ax[0].plot(\n", + " data.amplitudes[frame_id].times(), np.real(data.amplitudes[frame_id].values()), label=\"Real\"\n", + " )\n", + " ax[0].plot(\n", + " data.amplitudes[frame_id].times(), np.imag(data.amplitudes[frame_id].values()), label=\"Imag\"\n", + " )\n", " ax[0].set_ylabel(\"Amplitude\\n(a. u.)\")\n", - " ax[0].tick_params('x', labelbottom=False)\n", + " ax[0].tick_params(\"x\", labelbottom=False)\n", "\n", - " ax[1].plot(data.frequencies[frame_id].times(), np.array(data.frequencies[frame_id].values())*1e-9)\n", + " ax[1].plot(\n", + " data.frequencies[frame_id].times(), np.array(data.frequencies[frame_id].values()) * 1e-9\n", + " )\n", " ax[1].set_ylabel(\"Frequency\\n(GHz)\")\n", - " ax[1].tick_params('x', labelbottom=False)\n", + " ax[1].tick_params(\"x\", labelbottom=False)\n", "\n", " ax[2].plot(data.phases[frame_id].times(), data.phases[frame_id].values())\n", " ax[2].set_xlabel(\"Time (s)\")\n", @@ -484,13 +491,8 @@ "source": [ "@circuit.subroutine(register=True)\n", "def short_h_4():\n", - " return (\n", - " Circuit()\n", - " .pulse_gate(\n", - " [qubit], \n", - " pulse_sequence=single_x90_sequence(phi=0, lambda_=np.pi)\n", - " )\n", - " )\n", + " return Circuit().pulse_gate([qubit], pulse_sequence=single_x90_sequence(phi=0, lambda_=np.pi))\n", + "\n", "\n", "circ = Circuit().short_h_4()\n", "print(device.run(circ, shots=1000).result().measurement_counts)" @@ -515,8 +517,12 @@ "source": [ "print(\"Quantum Task Summary\")\n", "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\")" + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.3f} USD\"\n", + ")" ] }, { diff --git a/examples/pulse_control/qubit_spectroscopy/qubit_spectroscopy_sweep.py b/examples/pulse_control/qubit_spectroscopy/qubit_spectroscopy_sweep.py index c2f300dfe..a3522e55d 100644 --- a/examples/pulse_control/qubit_spectroscopy/qubit_spectroscopy_sweep.py +++ b/examples/pulse_control/qubit_spectroscopy/qubit_spectroscopy_sweep.py @@ -2,13 +2,14 @@ import json import os + import numpy as np from braket.aws import AwsDevice -from braket.parametric import FreeParameter -from braket.pulse import PulseSequence, GaussianWaveform, ConstantWaveform from braket.jobs import save_job_result from braket.jobs.metrics import log_metric +from braket.parametric import FreeParameter +from braket.pulse import GaussianWaveform, PulseSequence from braket.tracking import Tracker cost_tracker = Tracker().start() @@ -39,17 +40,9 @@ N_steps = int(hyperparams.get("N_steps", 25)) N_shots = int(hyperparams.get("N_shots", 100)) -span = ( - 75e6 - if not ("frequency_start" in hyperparams and "frequency_stop" in hyperparams) - else None -) -frequency_start = float( - hyperparams.get("frequency_start", drive_frame.frequency - span / 2) -) -frequency_stop = float( - hyperparams.get("frequency_stop", drive_frame.frequency + span / 2) -) +span = 75e6 if not ("frequency_start" in hyperparams and "frequency_stop" in hyperparams) else None +frequency_start = float(hyperparams.get("frequency_start", drive_frame.frequency - span / 2)) +frequency_stop = float(hyperparams.get("frequency_stop", drive_frame.frequency + span / 2)) frequency_free_parameter = FreeParameter("frequency") pulse_sequence = ( @@ -73,12 +66,8 @@ population_zero = counts["0"] / N_shots populations.append(population_zero) - braket_tasks_cost = float( - cost_tracker.simulator_tasks_cost() + cost_tracker.qpu_tasks_cost() - ) - log_metric( - metric_name="braket_tasks_cost", value=braket_tasks_cost, iteration_number=i - ) + braket_tasks_cost = float(cost_tracker.simulator_tasks_cost() + cost_tracker.qpu_tasks_cost()) + log_metric(metric_name="braket_tasks_cost", value=braket_tasks_cost, iteration_number=i) # Save the variables of interest so that we can access later save_job_result( diff --git a/examples/pulse_control/utils/draw_pulse_sequence.py b/examples/pulse_control/utils/draw_pulse_sequence.py index 28cd25921..59c260029 100644 --- a/examples/pulse_control/utils/draw_pulse_sequence.py +++ b/examples/pulse_control/utils/draw_pulse_sequence.py @@ -1,19 +1,24 @@ +import matplotlib.pyplot as plt +import numpy as np + from braket.pulse.pulse_sequence import PulseSequence from braket.pulse.waveforms import ArbitraryWaveform, Waveform -import numpy as np -import matplotlib.pyplot as plt def draw_waveform(waveform: Waveform, dt: float): """Plot the waveform dicretized by dt.""" if isinstance(waveform, ArbitraryWaveform): - plt.plot(np.arange(0, len(waveform.amplitudes))*dt*1e9, [amp.real for amp in waveform.amplitudes]) + plt.plot( + np.arange(0, len(waveform.amplitudes)) * dt * 1e9, + [amp.real for amp in waveform.amplitudes], + ) else: - y=waveform.sample(dt) - plt.plot(np.arange(0, len(y))*dt*1e9, y) + y = waveform.sample(dt) + plt.plot(np.arange(0, len(y)) * dt * 1e9, y) + + plt.xlabel("Time (ns)") + plt.ylabel("Amplitude (a. u.)") - plt.xlabel('Time (ns)') - plt.ylabel('Amplitude (a. u.)') def draw(pulse_sequence: PulseSequence): """Plot each frame of the pulse sequence in a single figure.""" @@ -70,9 +75,7 @@ def draw_multiple_frames(pulse_sequence: PulseSequence): plt.subplot(1, 3, 2) plt.title(frame_id) - plt.plot( - data.frequencies[frame_id].times(), data.frequencies[frame_id].values() - ) + plt.plot(data.frequencies[frame_id].times(), data.frequencies[frame_id].values()) plt.xlabel("Time (s)") plt.ylabel("Frequency (Hz)") diff --git a/examples/pulse_control/utils/extract_phases.py b/examples/pulse_control/utils/extract_phases.py index 47f94c0bd..e3dc5735d 100644 --- a/examples/pulse_control/utils/extract_phases.py +++ b/examples/pulse_control/utils/extract_phases.py @@ -1,8 +1,9 @@ -from braket.pulse import PulseSequence +import re -from openqasm3.visitor import QASMVisitor import openqasm3.ast as ast -import re +from openqasm3.visitor import QASMVisitor + +from braket.pulse import PulseSequence class _PhaseExtractor(QASMVisitor[dict]): @@ -37,7 +38,5 @@ def extract_phases(pulse_sequence: PulseSequence): """ phases = {"null": None} _PhaseExtractor().visit(pulse_sequence._program.to_ast(), phases) - phases.pop( - "null" - ) # {"null": None} is needed to avoid wrong test outcome in openqasm + phases.pop("null") # {"null": None} is needed to avoid wrong test outcome in openqasm return phases diff --git a/examples/qiskit/0_Getting_Started.ipynb b/examples/qiskit/0_Getting_Started.ipynb index 22b3e7b41..161c9b4bc 100644 --- a/examples/qiskit/0_Getting_Started.ipynb +++ b/examples/qiskit/0_Getting_Started.ipynb @@ -1,610 +1,624 @@ { - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "id": "a477c993", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# How to run Qiskit on Amazon Braket" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "3a9504c9", - "metadata": {}, - "outputs": [], - "source": [ - "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", - "from braket.tracking import Tracker\n", - "t = Tracker().start()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "c885d164", - "metadata": {}, - "source": [ - "If you're like many people who learned quantum computing in the past several years, you might have learned how to program quantum circuits with [Qiskit](https://qiskit.org): the open-source quantum Software Development Kit (SDK) first released in 2017. With the [Qiskit-Braket provider](https://github.com/qiskit-community/qiskit-braket-provider/blob/main/docs/tutorials/0_tutorial_qiskit-braket-provider_overview.ipynb), you can run your Qiskit code across any of the gate-based devices on the [Amazon Braket](https://aws.amazon.com/braket/) quantum computing service.\n", - "\n", - "**Note**: if you're running this in your local development environment (i.e. not from the Braket console), you'll need to make sure you've got your AWS account configured properly first to access Braket devices. Check out [this tutorial](https://aws.amazon.com/blogs/quantum-computing/setting-up-your-local-development-environment-in-amazon-braket/) for a walkthrough." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "b23c5287", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Access Braket devices from Qiskit \n", - "\n", - " There are quite a few different backend devices on Amazon Braket, so we'll walk through them one by one and give an example of recommended use cases for each." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "a94feb7b", - "metadata": {}, - "source": [ - "### Quantum simulators\n", - "Let's start with the ***local simulator***. This is a quantum full state vector simulator which runs *locally* -- that means wherever you're running this Jupyter notebook (e.g. your local development environment or a notebook instance on the Braket console).\n", - "\n", - "**Recommended use case:** Noiseless circuits up to ~12 qubits" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "f162ba69", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit_braket_provider import BraketLocalBackend\n", - "\n", - "local_simulator = BraketLocalBackend()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "17e2ab4d", - "metadata": {}, - "source": [ - "Next, we have the ***local density matrix simulator***. This simulator also runs on your local machine, but allows you to simulate the effects of *noise* on your quantum circuit. Because density matrices are twice the size of state vectors, the number of qubits you can effectively simulate is half the size as the local state vector simulator.\n", - "\n", - "**Recommended use case:** Noisy circuits up to ~6 qubits" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "2bfe0170", - "metadata": {}, - "outputs": [], - "source": [ - "local_dm_simulator = BraketLocalBackend(name='braket_dm')" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "de912d0e", - "metadata": {}, - "source": [ - "Now let's look at Braket's *on-demand* simulators: these run on AWS computing resources and have some expanded features in addition to those of the local simulator. We can list all the available Braket simulators with the following code:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "70a24c64", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[BraketBackend[SV1], BraketBackend[TN1], BraketBackend[dm1]]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from qiskit_braket_provider import BraketProvider\n", - "\n", - "provider = BraketProvider()\n", - "\n", - "provider.backends(statuses=[\"ONLINE\"], types=[\"SIMULATOR\"])" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "d846e7f2", - "metadata": {}, - "source": [ - "First up for on-demand simulators is ***SV1***. This is a full state vector simulator which allows you to simulate larger circuits than the local simulator, along with the ability to [batch tasks](https://docs.aws.amazon.com/braket/latest/developerguide/braket-batching-tasks.html) and run them in parallel, as well as use advanced techniques like [adjoint gradient calculations](https://pennylane.ai/blog/2022/12/computing-adjoint-gradients-with-amazon-braket-sv1/) for variational quantum algorithms. \n", - "\n", - "**Recommended use case:** Noiseless variational algorithms on up to 34 qubits" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "19024712", - "metadata": {}, - "outputs": [], - "source": [ - "sv1 = provider.get_backend(\"SV1\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "41c66765", - "metadata": {}, - "source": [ - "The next on-demand simulator is ***DM1***. This is a density matrix simulator which, like SV1, allows you to simulate a larger number of qubits, as well as take advantage of batch execution. \n", - "\n", - "**Recommended use case:** Noisy variational algorithms on up to 17 qubits" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "54e855a5", - "metadata": {}, - "outputs": [], - "source": [ - "dm1 = provider.get_backend(\"dm1\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "ae97b1a1", - "metadata": {}, - "source": [ - "Lastly for on-demand simulators, we have ***TN1***. This is a tensor-network simulator, which represents each gate in a circuit as a tensor. TN1 can simulate a larger number of qubits for circuits with local gates or other special structure, but will typically be slower than SV1 or DM1 for circuits with long-range or all-to-all gate structure.\n", - "\n", - "**Recommended use case:** Noiseless quantum circuits with local connectivity and up to 50 qubits" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "ad54a536", - "metadata": {}, - "source": [ - "**Note**: Each AWS resource, (like a file or CPU or QPU) lives in a specific region and may only be accessible from that region. For example, TN1 is only available in the `eu-west-2`, `us-east-1`, and `us-west-2` regions. \n", - "\n", - "To change your AWS region if you're running in a managed notebook, you'll need to use the GUI in the top right hand corner of the AWS console to select your new region, then relaunch or create your notebook from the Braket console.\n", - "\n", - "To change your AWS region if you're running in your local development environment, you run the following code snippet:\n", - "```\n", - "import os\n", - "os.environ[\"AWS_REGION\"] = \"your-desired-region\"\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cd711dcb", - "metadata": {}, - "outputs": [], - "source": [ - "# If you've switched to one of the regions where TN1 is accessible, feel free to uncomment the following code\n", - "# tn1 = provider.get_backend(\"TN1\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "dc6910f0", - "metadata": {}, - "source": [ - "### Quantum Processing Units (QPUs)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "8bfc8706", - "metadata": {}, - "source": [ - "Amazon Braket also provides access to a number of third-party quantum hardware devices. The following code shows how to view the supported QPUs which are currently online:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "f5329bca", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[BraketBackend[Ankaa-2],\n", - " BraketBackend[Aria 1],\n", - " BraketBackend[Forte 1],\n", - " BraketBackend[Garnet]]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "provider.backends(statuses=[\"ONLINE\"], types=[\"QPU\"])" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "4c7a21d4", - "metadata": {}, - "source": [ - "For a closer look at each quantum computer, you can peruse the [Providers Overview](https://aws.amazon.com/braket/quantum-computers/) on the Braket homepage, or the Devices tab on the left side of the Braket console. \n", - "Currently only gate-based QPUs (IonQ, Rigetti) are supported with the Qiskit-Braket provider. " - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "0800b99f", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Running circuits on Braket devices\n", - "\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "6bf048f4", - "metadata": {}, - "source": [ - "Now that we've walked through each of the quantum devices available through the Qiskit-Braket provider, let's take them for a spin! For this example, we'll create a 3-GHZ state on the Rigetti device, but feel free to choose a different QPU from the commented out devices below." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "a5beeb7b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BraketBackend[Ankaa-2]\n" - ] - } - ], - "source": [ - "qpu_backend = provider.get_backend(\"Ankaa-2\")\n", - "# qpu_backend = provider.get_backend(\"Aria\")\n", - "\n", - "print(qpu_backend)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "e9d90ed2", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
     ┌───┐          \n",
-                            "q_0: ┤ H ├──■────■──\n",
-                            "     └───┘┌─┴─┐  │  \n",
-                            "q_1: ─────┤ X ├──┼──\n",
-                            "          └───┘┌─┴─┐\n",
-                            "q_2: ──────────┤ X ├\n",
-                            "               └───┘
" - ], - "text/plain": [ - " ┌───┐ \n", - "q_0: ┤ H ├──■────■──\n", - " └───┘┌─┴─┐ │ \n", - "q_1: ─────┤ X ├──┼──\n", - " └───┘┌─┴─┐\n", - "q_2: ──────────┤ X ├\n", - " └───┘" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from qiskit import QuantumCircuit\n", - "\n", - "circuit = QuantumCircuit(3)\n", - "circuit.h(0)\n", - "circuit.cx(0, 1)\n", - "circuit.cx(0, 2)\n", - "circuit.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "32fd1f51", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [], - "source": [ - "# run circuit\n", - "qpu_task = qpu_backend.run(circuit, shots=10)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "9515c95b", - "metadata": {}, - "source": [ - "Each quantum task you run is assigned a unique ARN (Amazon Resource Name), which you can save and use to retrieve the data for your quantum task after its run, even if you close your notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d6f5d0da", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'arn:aws:braket:us-west-1:606892779558:quantum-task/59f83e11-3b1d-44cb-9d3e-bbb87ce37dd7'" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "task_id = qpu_task.task_id()\n", - "task_id" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "3b7ee5ac", - "metadata": {}, - "source": [ - "Now, Braket has a separate feature called \\\"Hybrid *Jobs*\\\", which is beyond the scope of this notebook, but which you can read about in the [developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "dec44bb5", - "metadata": {}, - "outputs": [], - "source": [ - "# Retrieve quantum task data\n", - "retrieved_task = qpu_backend.retrieve_job(task_id=task_id)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "355472d4", - "metadata": {}, - "source": [ - "Then you can check the status of the task to see if it's finished:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "bb84627d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "retrieved_task.status()" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "7c2d97be", - "metadata": {}, - "source": [ - "**Note:** different devices may have different availability windows, so while your task may not run right away, rest assured it will be added to the queue to be run when the device is back online." - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "d6f54cb5", - "metadata": {}, - "source": [ - "When your task is finished, you can retrieve the data:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "c510eb22", - "metadata": {}, - "outputs": [], - "source": [ - "data = retrieved_task.result()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "90660ecd", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit.visualization import plot_histogram\n", - "plot_histogram(data.get_counts())" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "1819e1f8", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Running algorithms on Braket devices" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "41520df9", - "metadata": {}, - "source": [ - "You can also use the Qiskit-Braket provider to run built-in Qiskit algorithms on Braket backends. For example, we can run the VQE algorithm to find the ground state of hydrogen. We'll use the local simulator since the problem can be expressed in a basis that only requires a few qubits and will run quickly." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1e7de04f", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit.quantum_info import SparsePauliOp\n", - "\n", - "# Define the Hamiltonian operator for H2 in terms of Pauli spin operators\n", - "H2_op = SparsePauliOp.from_list([('II', -1.052373245772859), ('IZ', 0.39793742484318045), ('ZI', -0.39793742484318045), ('ZZ', -0.01128010425623538), ('XX', 0.18093119978423156)])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9c5cbca8", - "metadata": {}, - "outputs": [], - "source": [ - "# Import some utilities\n", - "from qiskit.primitives import BackendEstimator\n", - "from qiskit.circuit.library import TwoLocal\n", - "from qiskit_algorithms.optimizers import SLSQP\n", - "from qiskit_algorithms import VQE\n", - "\n", - "# Define a `BackendEstimator` with a Braket backend\n", - "qi = BackendEstimator(local_simulator, options={'seed_simulator':42})\n", - "qi.set_transpile_options(seed_transpiler=42)\n", - "\n", - "# Specify VQE configuration\n", - "ansatz = TwoLocal(rotation_blocks=\"ry\", entanglement_blocks=\"cz\")\n", - "slsqp = SLSQP(maxiter=1)\n", - "vqe = VQE(estimator=qi, ansatz=ansatz, optimizer=slsqp)\n", - "\n", - "# Find the ground state\n", - "result = vqe.compute_minimum_eigenvalue(H2_op)\n", - "print(result)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "a5ce5134", - "metadata": {}, - "source": [ - "## What now?" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "a497c6ef", - "metadata": {}, - "source": [ - "The sky is the limit! Keep in mind, the Qiskit-Braket provider is still new and experimental, so if you run into a bug or want a new feature supported, consider [submitting a GitHub issue](https://github.com/qiskit-community/qiskit-braket-provider/issues) and opening a feature branch to join in on the development effort yourself!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "480d8040", - "metadata": {}, - "outputs": [], - "source": [ - "print(\"Quantum Task Summary\")\n", - "print(t.quantum_tasks_statistics())\n", - "print('Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).')\n", - "print(f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "61350edd", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "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.10" - } - }, - "nbformat": 4, - "nbformat_minor": 5 + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "a477c993", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# How to run Qiskit on Amazon Braket" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3a9504c9", + "metadata": {}, + "outputs": [], + "source": [ + "# Use Braket SDK Cost Tracking to estimate the cost to run this example\n", + "from braket.tracking import Tracker\n", + "\n", + "t = Tracker().start()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "c885d164", + "metadata": {}, + "source": [ + "If you're like many people who learned quantum computing in the past several years, you might have learned how to program quantum circuits with [Qiskit](https://qiskit.org): the open-source quantum Software Development Kit (SDK) first released in 2017. With the [Qiskit-Braket provider](https://github.com/qiskit-community/qiskit-braket-provider/blob/main/docs/tutorials/0_tutorial_qiskit-braket-provider_overview.ipynb), you can run your Qiskit code across any of the gate-based devices on the [Amazon Braket](https://aws.amazon.com/braket/) quantum computing service.\n", + "\n", + "**Note**: if you're running this in your local development environment (i.e. not from the Braket console), you'll need to make sure you've got your AWS account configured properly first to access Braket devices. Check out [this tutorial](https://aws.amazon.com/blogs/quantum-computing/setting-up-your-local-development-environment-in-amazon-braket/) for a walkthrough." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "b23c5287", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Access Braket devices from Qiskit \n", + "\n", + " There are quite a few different backend devices on Amazon Braket, so we'll walk through them one by one and give an example of recommended use cases for each." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a94feb7b", + "metadata": {}, + "source": [ + "### Quantum simulators\n", + "Let's start with the ***local simulator***. This is a quantum full state vector simulator which runs *locally* -- that means wherever you're running this Jupyter notebook (e.g. your local development environment or a notebook instance on the Braket console).\n", + "\n", + "**Recommended use case:** Noiseless circuits up to ~12 qubits" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f162ba69", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit_braket_provider import BraketLocalBackend\n", + "\n", + "local_simulator = BraketLocalBackend()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "17e2ab4d", + "metadata": {}, + "source": [ + "Next, we have the ***local density matrix simulator***. This simulator also runs on your local machine, but allows you to simulate the effects of *noise* on your quantum circuit. Because density matrices are twice the size of state vectors, the number of qubits you can effectively simulate is half the size as the local state vector simulator.\n", + "\n", + "**Recommended use case:** Noisy circuits up to ~6 qubits" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bfe0170", + "metadata": {}, + "outputs": [], + "source": [ + "local_dm_simulator = BraketLocalBackend(name=\"braket_dm\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "de912d0e", + "metadata": {}, + "source": [ + "Now let's look at Braket's *on-demand* simulators: these run on AWS computing resources and have some expanded features in addition to those of the local simulator. We can list all the available Braket simulators with the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "70a24c64", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[BraketBackend[SV1], BraketBackend[TN1], BraketBackend[dm1]]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit_braket_provider import BraketProvider\n", + "\n", + "provider = BraketProvider()\n", + "\n", + "provider.backends(statuses=[\"ONLINE\"], types=[\"SIMULATOR\"])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d846e7f2", + "metadata": {}, + "source": [ + "First up for on-demand simulators is ***SV1***. This is a full state vector simulator which allows you to simulate larger circuits than the local simulator, along with the ability to [batch tasks](https://docs.aws.amazon.com/braket/latest/developerguide/braket-batching-tasks.html) and run them in parallel, as well as use advanced techniques like [adjoint gradient calculations](https://pennylane.ai/blog/2022/12/computing-adjoint-gradients-with-amazon-braket-sv1/) for variational quantum algorithms. \n", + "\n", + "**Recommended use case:** Noiseless variational algorithms on up to 34 qubits" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "19024712", + "metadata": {}, + "outputs": [], + "source": [ + "sv1 = provider.get_backend(\"SV1\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "41c66765", + "metadata": {}, + "source": [ + "The next on-demand simulator is ***DM1***. This is a density matrix simulator which, like SV1, allows you to simulate a larger number of qubits, as well as take advantage of batch execution. \n", + "\n", + "**Recommended use case:** Noisy variational algorithms on up to 17 qubits" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "54e855a5", + "metadata": {}, + "outputs": [], + "source": [ + "dm1 = provider.get_backend(\"dm1\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "ae97b1a1", + "metadata": {}, + "source": [ + "Lastly for on-demand simulators, we have ***TN1***. This is a tensor-network simulator, which represents each gate in a circuit as a tensor. TN1 can simulate a larger number of qubits for circuits with local gates or other special structure, but will typically be slower than SV1 or DM1 for circuits with long-range or all-to-all gate structure.\n", + "\n", + "**Recommended use case:** Noiseless quantum circuits with local connectivity and up to 50 qubits" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "ad54a536", + "metadata": {}, + "source": [ + "**Note**: Each AWS resource, (like a file or CPU or QPU) lives in a specific region and may only be accessible from that region. For example, TN1 is only available in the `eu-west-2`, `us-east-1`, and `us-west-2` regions. \n", + "\n", + "To change your AWS region if you're running in a managed notebook, you'll need to use the GUI in the top right hand corner of the AWS console to select your new region, then relaunch or create your notebook from the Braket console.\n", + "\n", + "To change your AWS region if you're running in your local development environment, you run the following code snippet:\n", + "```\n", + "import os\n", + "os.environ[\"AWS_REGION\"] = \"your-desired-region\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd711dcb", + "metadata": {}, + "outputs": [], + "source": [ + "# If you've switched to one of the regions where TN1 is accessible, feel free to uncomment the following code\n", + "# tn1 = provider.get_backend(\"TN1\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "dc6910f0", + "metadata": {}, + "source": [ + "### Quantum Processing Units (QPUs)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "8bfc8706", + "metadata": {}, + "source": [ + "Amazon Braket also provides access to a number of third-party quantum hardware devices. The following code shows how to view the supported QPUs which are currently online:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f5329bca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[BraketBackend[Ankaa-2],\n", + " BraketBackend[Aria 1],\n", + " BraketBackend[Forte 1],\n", + " BraketBackend[Garnet]]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "provider.backends(statuses=[\"ONLINE\"], types=[\"QPU\"])" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "4c7a21d4", + "metadata": {}, + "source": [ + "For a closer look at each quantum computer, you can peruse the [Providers Overview](https://aws.amazon.com/braket/quantum-computers/) on the Braket homepage, or the Devices tab on the left side of the Braket console. \n", + "Currently only gate-based QPUs (IonQ, Rigetti) are supported with the Qiskit-Braket provider. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "0800b99f", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Running circuits on Braket devices\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "6bf048f4", + "metadata": {}, + "source": [ + "Now that we've walked through each of the quantum devices available through the Qiskit-Braket provider, let's take them for a spin! For this example, we'll create a 3-GHZ state on the Rigetti device, but feel free to choose a different QPU from the commented out devices below." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a5beeb7b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BraketBackend[Ankaa-2]\n" + ] + } + ], + "source": [ + "qpu_backend = provider.get_backend(\"Ankaa-2\")\n", + "# qpu_backend = provider.get_backend(\"Aria\")\n", + "\n", + "print(qpu_backend)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e9d90ed2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
     ┌───┐          \n",
+       "q_0: ┤ H ├──■────■──\n",
+       "     └───┘┌─┴─┐  │  \n",
+       "q_1: ─────┤ X ├──┼──\n",
+       "          └───┘┌─┴─┐\n",
+       "q_2: ──────────┤ X ├\n",
+       "               └───┘
" + ], + "text/plain": [ + " ┌───┐ \n", + "q_0: ┤ H ├──■────■──\n", + " └───┘┌─┴─┐ │ \n", + "q_1: ─────┤ X ├──┼──\n", + " └───┘┌─┴─┐\n", + "q_2: ──────────┤ X ├\n", + " └───┘" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import QuantumCircuit\n", + "\n", + "circuit = QuantumCircuit(3)\n", + "circuit.h(0)\n", + "circuit.cx(0, 1)\n", + "circuit.cx(0, 2)\n", + "circuit.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "32fd1f51", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [], + "source": [ + "# run circuit\n", + "qpu_task = qpu_backend.run(circuit, shots=10)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "9515c95b", + "metadata": {}, + "source": [ + "Each quantum task you run is assigned a unique ARN (Amazon Resource Name), which you can save and use to retrieve the data for your quantum task after its run, even if you close your notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d6f5d0da", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'arn:aws:braket:us-west-1:606892779558:quantum-task/59f83e11-3b1d-44cb-9d3e-bbb87ce37dd7'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "task_id = qpu_task.task_id()\n", + "task_id" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "3b7ee5ac", + "metadata": {}, + "source": [ + "Now, Braket has a separate feature called \\\"Hybrid *Jobs*\\\", which is beyond the scope of this notebook, but which you can read about in the [developer guide](https://docs.aws.amazon.com/braket/latest/developerguide/braket-jobs.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "dec44bb5", + "metadata": {}, + "outputs": [], + "source": [ + "# Retrieve quantum task data\n", + "retrieved_task = qpu_backend.retrieve_job(task_id=task_id)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "355472d4", + "metadata": {}, + "source": [ + "Then you can check the status of the task to see if it's finished:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bb84627d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retrieved_task.status()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "7c2d97be", + "metadata": {}, + "source": [ + "**Note:** different devices may have different availability windows, so while your task may not run right away, rest assured it will be added to the queue to be run when the device is back online." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "d6f54cb5", + "metadata": {}, + "source": [ + "When your task is finished, you can retrieve the data:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c510eb22", + "metadata": {}, + "outputs": [], + "source": [ + "data = retrieved_task.result()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "90660ecd", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit.visualization import plot_histogram\n", + "\n", + "plot_histogram(data.get_counts())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "1819e1f8", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Running algorithms on Braket devices" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "41520df9", + "metadata": {}, + "source": [ + "You can also use the Qiskit-Braket provider to run built-in Qiskit algorithms on Braket backends. For example, we can run the VQE algorithm to find the ground state of hydrogen. We'll use the local simulator since the problem can be expressed in a basis that only requires a few qubits and will run quickly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e7de04f", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit.quantum_info import SparsePauliOp\n", + "\n", + "# Define the Hamiltonian operator for H2 in terms of Pauli spin operators\n", + "H2_op = SparsePauliOp.from_list(\n", + " [\n", + " (\"II\", -1.052373245772859),\n", + " (\"IZ\", 0.39793742484318045),\n", + " (\"ZI\", -0.39793742484318045),\n", + " (\"ZZ\", -0.01128010425623538),\n", + " (\"XX\", 0.18093119978423156),\n", + " ]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c5cbca8", + "metadata": {}, + "outputs": [], + "source": [ + "# Import some utilities\n", + "from qiskit.circuit.library import TwoLocal\n", + "from qiskit.primitives import BackendEstimator\n", + "from qiskit_algorithms import VQE\n", + "from qiskit_algorithms.optimizers import SLSQP\n", + "\n", + "# Define a `BackendEstimator` with a Braket backend\n", + "qi = BackendEstimator(local_simulator, options={\"seed_simulator\": 42})\n", + "qi.set_transpile_options(seed_transpiler=42)\n", + "\n", + "# Specify VQE configuration\n", + "ansatz = TwoLocal(rotation_blocks=\"ry\", entanglement_blocks=\"cz\")\n", + "slsqp = SLSQP(maxiter=1)\n", + "vqe = VQE(estimator=qi, ansatz=ansatz, optimizer=slsqp)\n", + "\n", + "# Find the ground state\n", + "result = vqe.compute_minimum_eigenvalue(H2_op)\n", + "print(result)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a5ce5134", + "metadata": {}, + "source": [ + "## What now?" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "a497c6ef", + "metadata": {}, + "source": [ + "The sky is the limit! Keep in mind, the Qiskit-Braket provider is still new and experimental, so if you run into a bug or want a new feature supported, consider [submitting a GitHub issue](https://github.com/qiskit-community/qiskit-braket-provider/issues) and opening a feature branch to join in on the development effort yourself!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "480d8040", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Quantum Task Summary\")\n", + "print(t.quantum_tasks_statistics())\n", + "print(\n", + " \"Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2).\"\n", + ")\n", + "print(\n", + " f\"Estimated cost to run this example: {t.qpu_tasks_cost() + t.simulator_tasks_cost():.2f} USD\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61350edd", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "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.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 } diff --git a/pyproject.toml b/pyproject.toml index 3988b1641..b12ccc2dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,9 +56,33 @@ python -m ipykernel install --user --name "conda_braket" --display-name "conda_b pytest --dist worksteal -n logical -ra -v --durations=0 test/ """ +[tool.hatch.envs.lint] +detached = true +dependencies = [ + "ruff", +] + +[tool.hatch.envs.lint.scripts] +style = [ + "ruff check {args:.}", +] +fmt = [ + "ruff format {args:.}", + "style", +] [[tool.hatch.envs.all.matrix]] python = ["3.9", "3.10", "3.11"] [tool.hatch.metadata] allow-direct-references = true + +[tool.ruff] +target-version = "py39" +line-length = 100 +lint.isort = { known-first-party = [ + "braket", +] } +lint.extend-select = ["I"] +lint.preview = true +lint.ignore = ["E722"] diff --git a/test/integ_tests/advanced_circuits_algorithms/Randomness/Randomness_Generation_mocks.py b/test/integ_tests/advanced_circuits_algorithms/Randomness/Randomness_Generation_mocks.py index 6c3035c97..fbe8accea 100644 --- a/test/integ_tests/advanced_circuits_algorithms/Randomness/Randomness_Generation_mocks.py +++ b/test/integ_tests/advanced_circuits_algorithms/Randomness/Randomness_Generation_mocks.py @@ -1,5 +1,3 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) @@ -7,4 +5,4 @@ def pre_run_inject(mock_utils): def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/analog_hamiltonian_simulation/01_Introduction_to_Aquila_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/01_Introduction_to_Aquila_mocks.py index e9e05e898..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/01_Introduction_to_Aquila_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/01_Introduction_to_Aquila_mocks.py @@ -1,14 +1,14 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems_mocks.py index e9e05e898..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/02_Ordered_phases_in_Rydberg_systems_mocks.py @@ -1,14 +1,14 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila_mocks.py index e9e05e898..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/03_Parallel_tasks_on_Aquila_mocks.py @@ -1,14 +1,14 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation_mocks.py index f8af23858..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/04_Maximum_Independent_Sets_with_Analog_Hamiltonian_Simulation_mocks.py @@ -1,15 +1,14 @@ - - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane_mocks.py index 845fcaf56..e5921aee1 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/06_Analog_Hamiltonian_simulation_with_PennyLane_mocks.py @@ -1,15 +1,14 @@ - - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results_06.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms_mocks.py index 66a772bf2..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/07_Simulating_Lattice_Gauge_Theory_with_Rydberg_Atoms_mocks.py @@ -1,12 +1,12 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) diff --git a/test/integ_tests/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set_mocks.py index 66a772bf2..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/08_Maximum_Weight_Independent_Set_mocks.py @@ -1,12 +1,12 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) diff --git a/test/integ_tests/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays_mocks.py b/test/integ_tests/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays_mocks.py index 66a772bf2..4f0010b05 100644 --- a/test/integ_tests/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays_mocks.py +++ b/test/integ_tests/analog_hamiltonian_simulation/09_Noisy_quantum_dynamics_for_Rydberg_atom_arrays_mocks.py @@ -1,12 +1,12 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("ahs_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("ahs_device_capabilities.json", __file__), + } + ) mocker.set_task_result_return(mock_utils.read_file("ahs_results.json", __file__)) diff --git a/test/integ_tests/braket_features/Getting_Devices_and_Checking_Device_Properties_mocks.py b/test/integ_tests/braket_features/Getting_Devices_and_Checking_Device_Properties_mocks.py index 4d6f22a35..83574d42a 100644 --- a/test/integ_tests/braket_features/Getting_Devices_and_Checking_Device_Properties_mocks.py +++ b/test/integ_tests/braket_features/Getting_Devices_and_Checking_Device_Properties_mocks.py @@ -1,22 +1,26 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() - mocker.set_get_device_result({ - "deviceType": "QPU", - "deviceCapabilities": mock_utils.read_file("default_capabilities.json") - }) - mocker.set_search_result([ + mocker.set_get_device_result( { - "devices": [ - { - "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", - "deviceName": "Test Device", - "deviceType": "ONLINE", - "deviceStatus": "AVAILABLE", - "providerName": "Test Provider" - } - ] + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file("default_capabilities.json"), } - ]) + ) + mocker.set_search_result( + [ + { + "devices": [ + { + "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", + "deviceName": "Test Device", + "deviceType": "ONLINE", + "deviceStatus": "AVAILABLE", + "providerName": "Test Provider", + } + ] + } + ] + ) def post_run(tb): diff --git a/test/integ_tests/braket_features/TN1_demo_local_vs_non-local_random_circuits_mocks.py b/test/integ_tests/braket_features/TN1_demo_local_vs_non-local_random_circuits_mocks.py index eb6751610..82bb7959c 100644 --- a/test/integ_tests/braket_features/TN1_demo_local_vs_non-local_random_circuits_mocks.py +++ b/test/integ_tests/braket_features/TN1_demo_local_vs_non-local_random_circuits_mocks.py @@ -1,23 +1,19 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_quantum_task_result({ - "quantumTaskArn" : "arn:aws:braket:us-west-2:000000:quantum-task/TestARN", - "status" : "COMPLETED", - "outputS3Bucket" : "Test Bucket", - "outputS3Directory" : "Test Directory", - "shots": 10, - "deviceArn": "Test Device Arn", - "failureReason": "Test", - "ResponseMetadata": { - "HTTPHeaders": { - "date": "" - } + mocker.set_get_quantum_task_result( + { + "quantumTaskArn": "arn:aws:braket:us-west-2:000000:quantum-task/TestARN", + "status": "COMPLETED", + "outputS3Bucket": "Test Bucket", + "outputS3Directory": "Test Directory", + "shots": 10, + "deviceArn": "Test Device Arn", + "failureReason": "Test", + "ResponseMetadata": {"HTTPHeaders": {"date": ""}}, } - }) + ) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/braket_features/Using_The_Adjoint_Gradient_Result_Type_mocks.py b/test/integ_tests/braket_features/Using_The_Adjoint_Gradient_Result_Type_mocks.py index c55b098af..9f5a41849 100644 --- a/test/integ_tests/braket_features/Using_The_Adjoint_Gradient_Result_Type_mocks.py +++ b/test/integ_tests/braket_features/Using_The_Adjoint_Gradient_Result_Type_mocks.py @@ -1,6 +1,5 @@ - - import random + import numpy as np @@ -23,4 +22,4 @@ def pre_run_inject(mock_utils): def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/conftest.py b/test/integ_tests/conftest.py index 28ff3f1b0..ed9ddf781 100644 --- a/test/integ_tests/conftest.py +++ b/test/integ_tests/conftest.py @@ -3,10 +3,13 @@ def pytest_addoption(parser): parser.addoption( - '--mock-level', action='store', default='ALL', help='ALL=mock everything, LEAST=mock least possible' + "--mock-level", + action="store", + default="ALL", + help="ALL=mock everything, LEAST=mock least possible", ) @pytest.fixture def mock_level(request): - return request.config.getoption('--mock-level') \ No newline at end of file + return request.config.getoption("--mock-level") diff --git a/test/integ_tests/default_mocks/default_mocks.py b/test/integ_tests/default_mocks/default_mocks.py index 9e0aaac9f..523d961f6 100644 --- a/test/integ_tests/default_mocks/default_mocks.py +++ b/test/integ_tests/default_mocks/default_mocks.py @@ -1,9 +1,7 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits_mocks.py b/test/integ_tests/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits_mocks.py index f8636dd57..189dff422 100644 --- a/test/integ_tests/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits_mocks.py +++ b/test/integ_tests/getting_started/3_Deep_dive_into_the_anatomy_of_quantum_circuits/3_Deep_dive_into_the_anatomy_of_quantum_circuits_mocks.py @@ -4,9 +4,11 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_cancel_quantum_task_result({ - "cancellationStatus": "CANCELLING", - }) + mocker.set_cancel_quantum_task_result( + { + "cancellationStatus": "CANCELLING", + } + ) def post_run(tb): diff --git a/test/integ_tests/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job_mocks.py b/test/integ_tests/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job_mocks.py index 46de40af4..04512772e 100644 --- a/test/integ_tests/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job_mocks.py +++ b/test/integ_tests/hybrid_jobs/0_Creating_your_first_Hybrid_Job/0_Creating_your_first_Hybrid_Job_mocks.py @@ -1,6 +1,6 @@ import os -import tarfile import subprocess +import tarfile import unittest.mock as mock default_job_results = "" @@ -10,29 +10,25 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) mock_utils.mock_default_job_calls(mocker) - mocker.set_create_job_side_effect([ - { - "jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob" - }, + mocker.set_create_job_side_effect( + [ + {"jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob"}, + {"jobArn": "arn:aws:braket:us-west-1:000000:job/testJob"}, + ] + ) + mocker.set_log_streams_result({"logStreams": []}) + mocker.set_get_query_results_result( { - "jobArn": f"arn:aws:braket:us-west-1:000000:job/testJob" - }, - ]) - mocker.set_log_streams_result({ - "logStreams": [] - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;expval=0;"}, - {"field": "@timestamp", "value": "0"}, + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;expval=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) - mocker.set_start_query_result({ - "queryId": "TestId" - }) + } + ) + mocker.set_start_query_result({"queryId": "TestId"}) global default_job_results default_job_results = mock_utils.read_file("../job_results.json", __file__) with open("results.json", "w") as f: @@ -41,7 +37,9 @@ def pre_run_inject(mock_utils): tar.add("results.json") subprocess.check_output = subprocess_check_output - os.environ["AMZN_BRAKET_DEVICE_ARN"] = f"arn:aws:braket:{mocker.region_name}::device/qpu/arn/TestARN" + os.environ["AMZN_BRAKET_DEVICE_ARN"] = ( + f"arn:aws:braket:{mocker.region_name}::device/qpu/arn/TestARN" + ) def post_run(tb): diff --git a/test/integ_tests/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs_mocks.py b/test/integ_tests/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs_mocks.py index 86b0f8903..754820612 100644 --- a/test/integ_tests/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs_mocks.py +++ b/test/integ_tests/hybrid_jobs/1_Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs/Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs_mocks.py @@ -7,38 +7,60 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) mock_utils.mock_default_job_calls(mocker) - mocker.set_log_streams_result({ - "logStreams": [] - }) - mocker.set_start_query_result({ - "queryId": "TestId" - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;loss=0;"}, - {"field": "@timestamp", "value": "0"} + mocker.set_log_streams_result({"logStreams": []}) + mocker.set_start_query_result({"queryId": "TestId"}) + mocker.set_get_query_results_result( + { + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;loss=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) + } + ) default_job_results = { - 'params': np.array( + "params": np.array( [ - 0.77996265, 0.52813787, 0.61299074, -0.09124156, 0.17680213, - -0.02222335, 0.91524364, -0.31786518, 0.64940861, 0.62663773, - 0.87611417, -0.0715285, -0.00379581, 1.04400452, 0.20672916, - 0.94888017, 0.55607485, 1.03805133, 1.08456977, -0.75108754, - 1.13637642, 0.72634854, 0.93536659, 0.17868376, 0.79434158, - 0.05315669, 0.81228023, -0.62405866, 0.10342629, -0.8736394 + 0.77996265, + 0.52813787, + 0.61299074, + -0.09124156, + 0.17680213, + -0.02222335, + 0.91524364, + -0.31786518, + 0.64940861, + 0.62663773, + 0.87611417, + -0.0715285, + -0.00379581, + 1.04400452, + 0.20672916, + 0.94888017, + 0.55607485, + 1.03805133, + 1.08456977, + -0.75108754, + 1.13637642, + 0.72634854, + 0.93536659, + 0.17868376, + 0.79434158, + 0.05315669, + 0.81228023, + -0.62405866, + 0.10342629, + -0.8736394, ] ), - 'task summary': {}, - 'estimated cost': 0.0, + "task summary": {}, + "estimated cost": 0.0, } mock_utils.mock_job_results(default_job_results) # not explicitly stopped as notebooks are run in new kernels - patch('cloudpickle.dumps', return_value='serialized').start() + patch("cloudpickle.dumps", return_value="serialized").start() def post_run(tb): diff --git a/test/integ_tests/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs_mocks.py b/test/integ_tests/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs_mocks.py index 0d6253158..c688cd62d 100644 --- a/test/integ_tests/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs_mocks.py +++ b/test/integ_tests/hybrid_jobs/2_Using_PennyLane_with_Braket_Hybrid_Jobs/Using_PennyLane_with_Braket_Hybrid_Jobs_mocks.py @@ -6,44 +6,35 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) mock_utils.mock_default_job_calls(mocker) - mocker.set_get_job_result({ - "instanceConfig": { - "instanceCount": 1 - }, - "jobName": "testJob", - "status": "COMPLETED", - "outputDataConfig": { - "s3Path": "s3://amazon-br-invalid-path/test-path/test-results" - }, - "checkpointConfig": { - "s3Uri": "s3://amazon-br-invalid-path/test-path/test-results" + mocker.set_get_job_result( + { + "instanceConfig": {"instanceCount": 1}, + "jobName": "testJob", + "status": "COMPLETED", + "outputDataConfig": {"s3Path": "s3://amazon-br-invalid-path/test-path/test-results"}, + "checkpointConfig": {"s3Uri": "s3://amazon-br-invalid-path/test-path/test-results"}, } - }) - mocker.set_log_streams_result({ - "logStreams": [] - }) - mocker.set_start_query_result({ - "queryId": "TestId" - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;loss=0;"}, - {"field": "@timestamp", "value": "0"} + ) + mocker.set_log_streams_result({"logStreams": []}) + mocker.set_start_query_result({"queryId": "TestId"}) + mocker.set_get_query_results_result( + { + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;loss=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) - mocker.set_list_objects_v2_result({ - "Contents": [], - "IsTruncated": False - }) + } + ) + mocker.set_list_objects_v2_result({"Contents": [], "IsTruncated": False}) default_job_results = mock_utils.read_file("../job_results.json", __file__) with open("results.json", "w") as f: f.write(default_job_results) with tarfile.open("model.tar.gz", "w:gz") as tar: tar.add("results.json") - mock.patch('cloudpickle.dumps', return_value='serialized').start() + mock.patch("cloudpickle.dumps", return_value="serialized").start() def post_run(tb): diff --git a/test/integ_tests/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs_mocks.py b/test/integ_tests/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs_mocks.py index d0a88c00c..e523f955f 100644 --- a/test/integ_tests/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs_mocks.py +++ b/test/integ_tests/hybrid_jobs/4_Embedded_simulators_in_Braket_Hybrid_Jobs/Embedded_simulators_in_Braket_Hybrid_Jobs_mocks.py @@ -1,41 +1,29 @@ import os -import tarfile import subprocess +import tarfile import unittest.mock as mock - default_job_results = "" def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_search_result([ + mocker.set_search_result( + [{"Roles": [{"RoleName": "AmazonBraketJobsExecutionRole", "Arn": "TestRoleARN"}]}] + ) + mocker.set_create_job_result( + {"jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob"} + ) + mocker.set_get_job_result( { - "Roles" : [ - { - "RoleName": "AmazonBraketJobsExecutionRole", - "Arn" : "TestRoleARN" - } - ] - } - ]) - mocker.set_create_job_result({ - "jobArn" : f"arn:aws:braket:{mocker.region_name}:000000:job/testJob" - }) - mocker.set_get_job_result({ - "instanceConfig" : { - "instanceCount" : 1 - }, - "jobName": "testJob", - "status": "COMPLETED", - "outputDataConfig": { - "s3Path" : "s3://amazon-br-invalid-path/test-path/test-results" + "instanceConfig": {"instanceCount": 1}, + "jobName": "testJob", + "status": "COMPLETED", + "outputDataConfig": {"s3Path": "s3://amazon-br-invalid-path/test-path/test-results"}, } - }) - mocker.set_log_streams_result({ - "logStreams": [] - }) + ) + mocker.set_log_streams_result({"logStreams": []}) global default_job_results default_job_results = mock_utils.read_file("../job_results.json", __file__) with open("results.json", "w") as f: diff --git a/test/integ_tests/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML_mocks.py b/test/integ_tests/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML_mocks.py index e2e2256cf..bb0795c06 100644 --- a/test/integ_tests/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML_mocks.py +++ b/test/integ_tests/hybrid_jobs/5_Parallelize_training_for_QML/Parallelize_training_for_QML_mocks.py @@ -4,44 +4,33 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_search_result([ + mocker.set_search_result( + [{"Roles": [{"RoleName": "AmazonBraketJobsExecutionRole", "Arn": "TestRoleARN"}]}] + ) + mocker.set_create_job_result( + {"jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob"} + ) + mocker.set_get_job_result( { - "Roles" : [ - { - "RoleName": "AmazonBraketJobsExecutionRole", - "Arn" : "TestRoleARN" - } - ] + "instanceConfig": {"instanceCount": 1}, + "jobName": "testJob", + "status": "COMPLETED", + "outputDataConfig": {"s3Path": "s3://amazon-br-invalid-path/test-path/test-results"}, } - ]) - mocker.set_create_job_result({ - "jobArn" : f"arn:aws:braket:{mocker.region_name}:000000:job/testJob" - }) - mocker.set_get_job_result({ - "instanceConfig" : { - "instanceCount" : 1 - }, - "jobName": "testJob", - "status": "COMPLETED", - "outputDataConfig": { - "s3Path" : "s3://amazon-br-invalid-path/test-path/test-results" - } - }) - mocker.set_log_streams_result({ - "logStreams": [] - }) - mocker.set_start_query_result({ - "queryId": "TestId" - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;loss=0;"}, - {"field": "@timestamp", "value": "0"} + ) + mocker.set_log_streams_result({"logStreams": []}) + mocker.set_start_query_result({"queryId": "TestId"}) + mocker.set_get_query_results_result( + { + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;loss=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) + } + ) default_job_results = mock_utils.read_file("../job_results.json", __file__) with open("results.json", "w") as f: f.write(default_job_results) @@ -57,4 +46,3 @@ def post_run(tb): os.remove("results.json") """ ) - diff --git a/test/integ_tests/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs_mocks.py b/test/integ_tests/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs_mocks.py index d55954b91..c54261b09 100644 --- a/test/integ_tests/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs_mocks.py +++ b/test/integ_tests/hybrid_jobs/7_Running_notebooks_as_hybrid_jobs/Running_notebooks_as_hybrid_jobs_mocks.py @@ -4,51 +4,35 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_search_result([ + mocker.set_search_result( + [{"Roles": [{"RoleName": "AmazonBraketJobsExecutionRole", "Arn": "TestRoleARN"}]}] + ) + mocker.set_create_job_result( + {"jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob"} + ) + mocker.set_get_job_result( { - "Roles" : [ - { - "RoleName": "AmazonBraketJobsExecutionRole", - "Arn" : "TestRoleARN" - } - ] + "instanceConfig": {"instanceCount": 1}, + "jobName": "testJob", + "status": "COMPLETED", + "outputDataConfig": {"s3Path": "s3://amazon-br-invalid-path/test-path/test-results"}, + "checkpointConfig": {"s3Uri": "s3://amazon-br-invalid-path/test-path/test-results"}, } - ]) - mocker.set_create_job_result({ - "jobArn" : f"arn:aws:braket:{mocker.region_name}:000000:job/testJob" - }) - mocker.set_get_job_result({ - "instanceConfig" : { - "instanceCount" : 1 - }, - "jobName": "testJob", - "status": "COMPLETED", - "outputDataConfig": { - "s3Path" : "s3://amazon-br-invalid-path/test-path/test-results" - }, - "checkpointConfig": { - "s3Uri" : "s3://amazon-br-invalid-path/test-path/test-results" - } - }) - mocker.set_log_streams_result({ - "logStreams": [] - }) - mocker.set_start_query_result({ - "queryId": "TestId" - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;cost=0;"}, - {"field": "@timestamp", "value": "0"} + ) + mocker.set_log_streams_result({"logStreams": []}) + mocker.set_start_query_result({"queryId": "TestId"}) + mocker.set_get_query_results_result( + { + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;cost=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) - mocker.set_list_objects_v2_result({ - "Contents" : [], - "IsTruncated": False - }) + } + ) + mocker.set_list_objects_v2_result({"Contents": [], "IsTruncated": False}) default_job_results = mock_utils.read_file("../job_results.json", __file__) with open("results.json", "w") as f: f.write(default_job_results) @@ -64,4 +48,3 @@ def post_run(tb): os.remove("results.json") """ ) - diff --git a/test/integ_tests/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job_mocks.py b/test/integ_tests/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job_mocks.py index 251aaf73c..87ada8100 100644 --- a/test/integ_tests/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job_mocks.py +++ b/test/integ_tests/hybrid_jobs/8_Creating_Hybrid_Job_Scripts/Creating_your_first_Hybrid_Job_mocks.py @@ -1,6 +1,6 @@ import os -import tarfile import subprocess +import tarfile import unittest.mock as mock default_job_results = "" @@ -10,21 +10,19 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) mock_utils.mock_default_job_calls(mocker) - mocker.set_log_streams_result({ - "logStreams": [] - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;expval=0;"}, - {"field": "@timestamp", "value": "0"}, + mocker.set_log_streams_result({"logStreams": []}) + mocker.set_get_query_results_result( + { + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;expval=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) - mocker.set_start_query_result({ - "queryId": "TestId" - }) + } + ) + mocker.set_start_query_result({"queryId": "TestId"}) global default_job_results default_job_results = mock_utils.read_file("../job_results.json", __file__) with open("results.json", "w") as f: @@ -35,7 +33,9 @@ def pre_run_inject(mock_utils): subprocess.check_output = subprocess_check_output subprocess.Popen = subprocess_open - os.environ["AMZN_BRAKET_DEVICE_ARN"] = f"arn:aws:braket:{mocker.region_name}::device/qpu/arn/TestARN" + os.environ["AMZN_BRAKET_DEVICE_ARN"] = ( + f"arn:aws:braket:{mocker.region_name}::device/qpu/arn/TestARN" + ) def post_run(tb): diff --git a/test/integ_tests/mock_utils.py b/test/integ_tests/mock_utils.py index f68c82a61..90569fd43 100644 --- a/test/integ_tests/mock_utils.py +++ b/test/integ_tests/mock_utils.py @@ -1,17 +1,17 @@ +import json import os import sys import tarfile +import unittest.mock as mock from itertools import cycle import boto3 -import unittest.mock as mock -import braket.tracking import matplotlib.pyplot as plt -import json -import braket.aws -from braket.jobs_data import PersistedJobData, PersistedJobDataFormat +import braket.aws +import braket.tracking from braket.jobs.serialization import serialize_values +from braket.jobs_data import PersistedJobData, PersistedJobDataFormat plt.savefig = mock.Mock() @@ -20,7 +20,9 @@ class Mocker: mock_level = "ALL" def __init__(self): - self._wrapper = Boto3SessionAllWrapper() if Mocker.mock_level == "ALL" else AwsSessionMinWrapper() + self._wrapper = ( + Boto3SessionAllWrapper() if Mocker.mock_level == "ALL" else AwsSessionMinWrapper() + ) braket.tracking.Tracker = mock.Mock() tracker = braket.tracking.Tracker().start() tracker.qpu_tasks_cost.return_value = 0 @@ -89,87 +91,71 @@ def read_file(name, file_path=None): def mock_default_device_calls(mocker): - mocker.set_get_device_result({ - "deviceType": "QPU", - "deviceCapabilities": read_file("default_capabilities.json"), - "deviceQueueInfo": [ - { - "queue": "QUANTUM_TASKS_QUEUE", - "queueSize": "13", - "queuePriority": "Normal" - }, - { + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": read_file("default_capabilities.json"), + "deviceQueueInfo": [ + {"queue": "QUANTUM_TASKS_QUEUE", "queueSize": "13", "queuePriority": "Normal"}, + {"queue": "QUANTUM_TASKS_QUEUE", "queueSize": "0", "queuePriority": "Priority"}, + {"queue": "JOBS_QUEUE", "queueSize": "0"}, + ], + } + ) + mocker.set_create_quantum_task_result( + { + "quantumTaskArn": "arn:aws:braket:us-west-2:000000:quantum-task/TestARN", + } + ) + mocker.set_get_quantum_task_result( + { + "quantumTaskArn": "arn:aws:braket:us-west-2:000000:quantum-task/TestARN", + "status": "COMPLETED", + "outputS3Bucket": "Test Bucket", + "outputS3Directory": "Test Directory", + "shots": 10, + "deviceArn": "Test Device Arn", + "queueInfo": { "queue": "QUANTUM_TASKS_QUEUE", - "queueSize": "0", - "queuePriority": "Priority" + "position": "2", + "queuePriority": "Normal", }, - { - "queue": "JOBS_QUEUE", - "queueSize": "0" - } - ] - }) - mocker.set_create_quantum_task_result({ - "quantumTaskArn": "arn:aws:braket:us-west-2:000000:quantum-task/TestARN", - }) - mocker.set_get_quantum_task_result({ - "quantumTaskArn": "arn:aws:braket:us-west-2:000000:quantum-task/TestARN", - "status": "COMPLETED", - "outputS3Bucket": "Test Bucket", - "outputS3Directory": "Test Directory", - "shots": 10, - "deviceArn": "Test Device Arn", - "queueInfo": { - "queue": "QUANTUM_TASKS_QUEUE", - "position": "2", - "queuePriority": "Normal", - }, - "ResponseMetadata": { - "HTTPHeaders": { - "date": "" - } + "ResponseMetadata": {"HTTPHeaders": {"date": ""}}, } - }) + ) mocker.set_task_result_return(read_file("default_results.json")) def mock_default_job_calls(mocker): mocker.set_batch_get_image_side_effect( - cycle([ - {"images": [{"imageId": {"imageDigest": "my-digest"}}]}, - { - "images": [ - {"imageId": {"imageTag": f"-py3{sys.version_info.minor}-"}}, - ] - }, - ]) - ) - mocker.set_search_result([ - { - "Roles": [ + cycle( + [ + {"images": [{"imageId": {"imageDigest": "my-digest"}}]}, { - "RoleName": "AmazonBraketJobsExecutionRole", - "Arn": "TestRoleARN" - } + "images": [ + {"imageId": {"imageTag": f"-py3{sys.version_info.minor}-"}}, + ] + }, ] + ) + ) + mocker.set_search_result( + [{"Roles": [{"RoleName": "AmazonBraketJobsExecutionRole", "Arn": "TestRoleARN"}]}] + ) + mocker.set_create_job_result( + {"jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob"} + ) + mocker.set_get_job_result( + { + "instanceConfig": {"instanceCount": 1}, + "jobName": "testJob", + "status": "COMPLETED", + "outputDataConfig": {"s3Path": "s3://amazon-br-invalid-path/test-path/test-results"}, + "queueInfo": { + "position": 1, + }, } - ]) - mocker.set_create_job_result({ - "jobArn": f"arn:aws:braket:{mocker.region_name}:000000:job/testJob" - }) - mocker.set_get_job_result({ - "instanceConfig": { - "instanceCount": 1 - }, - "jobName": "testJob", - "status": "COMPLETED", - "outputDataConfig": { - "s3Path": "s3://amazon-br-invalid-path/test-path/test-results" - }, - "queueInfo": { - "position": 1, - }, - }) + ) def mock_job_results(results): @@ -188,7 +174,7 @@ def set_level(mock_level): Mocker.mock_level = mock_level -class SessionWrapper(): +class SessionWrapper: def __init__(self): self.boto_client = mock.Mock() self.task_result_mock = mock.Mock() @@ -196,18 +182,10 @@ def __init__(self): return_mock = mock.Mock() return_mock.read.return_value.decode = self.task_result_mock - self.resource_mock.Object.return_value.get.return_value = { - "Body": return_mock - } - self.boto_client.get_caller_identity.return_value = { - "Account": "TestAccount" - } + self.resource_mock.Object.return_value.get.return_value = {"Body": return_mock} + self.boto_client.get_caller_identity.return_value = {"Account": "TestAccount"} self.boto_client.get_authorization_token.return_value = { - "authorizationData": [ - { - "authorizationToken": "TestToken" - } - ] + "authorizationData": [{"authorizationToken": "TestToken"}] } @@ -244,17 +222,26 @@ class AwsSessionMinWrapper(SessionWrapper): def __init__(self): super().__init__() import braket.jobs.metrics_data.cwl_insights_metrics_fetcher as md + AwsSessionFacade._wrapper = self AwsSessionFacade.real_get_device = braket.aws.aws_session.AwsSession.get_device braket.aws.aws_session.AwsSession.get_device = AwsSessionFacade.get_device - AwsSessionFacade.real_create_quantum_task = braket.aws.aws_session.AwsSession.create_quantum_task + AwsSessionFacade.real_create_quantum_task = ( + braket.aws.aws_session.AwsSession.create_quantum_task + ) braket.aws.aws_session.AwsSession.create_quantum_task = AwsSessionFacade.create_quantum_task AwsSessionFacade.real_get_quantum_task = braket.aws.aws_session.AwsSession.get_quantum_task braket.aws.aws_session.AwsSession.get_quantum_task = AwsSessionFacade.get_quantum_task - AwsSessionFacade.real_cancel_quantum_task = braket.aws.aws_session.AwsSession.cancel_quantum_task + AwsSessionFacade.real_cancel_quantum_task = ( + braket.aws.aws_session.AwsSession.cancel_quantum_task + ) braket.aws.aws_session.AwsSession.cancel_quantum_task = AwsSessionFacade.cancel_quantum_task - AwsSessionFacade.real_retrieve_s3_object_body = braket.aws.aws_session.AwsSession.retrieve_s3_object_body - braket.aws.aws_session.AwsSession.retrieve_s3_object_body = AwsSessionFacade.retrieve_s3_object_body + AwsSessionFacade.real_retrieve_s3_object_body = ( + braket.aws.aws_session.AwsSession.retrieve_s3_object_body + ) + braket.aws.aws_session.AwsSession.retrieve_s3_object_body = ( + AwsSessionFacade.retrieve_s3_object_body + ) braket.aws.aws_session.AwsSession.create_job = AwsSessionFacade.create_job braket.aws.aws_session.AwsSession.get_job = AwsSessionFacade.get_job braket.aws.aws_session.AwsSession.cancel_job = AwsSessionFacade.cancel_job @@ -295,19 +282,22 @@ def create_quantum_task(self, **boto3_kwargs): device_name = device_arn.split("/")[-1] if device_name in AwsSessionFacade.unsupported_device_config: return AwsSessionFacade._wrapper.boto_client.create_quantum_task(boto3_kwargs)[ - "quantumTaskArn"] + "quantumTaskArn" + ] if device_name in AwsSessionFacade.mock_device_config: device_sub = AwsSessionFacade.mock_device_config[device_name] if device_sub == "MOCK": return AwsSessionFacade._wrapper.boto_client.create_quantum_task(boto3_kwargs)[ - "quantumTaskArn"] + "quantumTaskArn" + ] else: boto3_kwargs["deviceArn"] = device_sub task_arn = AwsSessionFacade.real_create_quantum_task(self, **boto3_kwargs) AwsSessionFacade.created_task_arns.add(task_arn) return task_arn return AwsSessionFacade._wrapper.boto_client.create_quantum_task(boto3_kwargs)[ - "quantumTaskArn"] + "quantumTaskArn" + ] def get_quantum_task(self, arn): if arn in AwsSessionFacade.created_task_arns: @@ -334,7 +324,7 @@ def copy_s3_directory(self, source_s3_path, destination_s3_path): return def retrieve_s3_object_body(self, s3_bucket, s3_object_key): - location = s3_object_key[:s3_object_key.rindex("/")] + location = s3_object_key[: s3_object_key.rindex("/")] if location in AwsSessionFacade.created_task_locations: return AwsSessionFacade.real_retrieve_s3_object_body(self, s3_bucket, s3_object_key) if AwsSessionFacade._wrapper.task_result_mock.side_effect is not None: diff --git a/test/integ_tests/pennylane/0_Getting_started/0_Getting_started_mocks.py b/test/integ_tests/pennylane/0_Getting_started/0_Getting_started_mocks.py index 18510bf53..017554aa6 100644 --- a/test/integ_tests/pennylane/0_Getting_started/0_Getting_started_mocks.py +++ b/test/integ_tests/pennylane/0_Getting_started/0_Getting_started_mocks.py @@ -1,10 +1,6 @@ -import tarfile from unittest.mock import patch import numpy as np -from braket.jobs_data import PersistedJobData, PersistedJobDataFormat - -from braket.jobs.serialization import serialize_values def pre_run_inject(mock_utils): @@ -13,16 +9,36 @@ def pre_run_inject(mock_utils): mock_utils.mock_default_job_calls(mocker) mocker.set_task_result_return(mock_utils.read_file("../pennylane_results.json", __file__)) default_job_results = { - 'params': np.array([0.32900000000000007, 2.5835999999999997]), - 'costs': np.array([ - 0.974, 0.958, 0.932, 0.936, 0.894, 0.838, 0.794, 0.73, - 0.7, 0.544, 0.426, 0.284, 0.156, 0.056, -0.124, -0.24, - -0.374, -0.558, -0.69, -0.748 - ]), - 'braket_tasks_cost': 0.375, + "params": np.array([0.32900000000000007, 2.5835999999999997]), + "costs": np.array( + [ + 0.974, + 0.958, + 0.932, + 0.936, + 0.894, + 0.838, + 0.794, + 0.73, + 0.7, + 0.544, + 0.426, + 0.284, + 0.156, + 0.056, + -0.124, + -0.24, + -0.374, + -0.558, + -0.69, + -0.748, + ] + ), + "braket_tasks_cost": 0.375, } mock_utils.mock_job_results(default_job_results) - patch('cloudpickle.dumps', return_value='serialized').start() + patch("cloudpickle.dumps", return_value="serialized").start() + def post_run(tb): tb.inject( diff --git a/test/integ_tests/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits_mocks.py b/test/integ_tests/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits_mocks.py index 5dec33c83..a85ca840d 100644 --- a/test/integ_tests/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits_mocks.py +++ b/test/integ_tests/pennylane/1_Parallelized_optimization_of_quantum_circuits/1_Parallelized_optimization_of_quantum_circuits_mocks.py @@ -1,34 +1,23 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) mocker.set_task_result_return(mock_utils.read_file("1_pennylane_results.json", __file__)) - mocker.set_get_device_result({ - "deviceArn": "arn:aws:braket:::device/quantum-simulator/amazon/sv1", - "deviceCapabilities": mock_utils.read_file("1_pennylane_capabilities.json", __file__), - "deviceName": "SV1", - "deviceQueueInfo": [ - { - "queue": "QUANTUM_TASKS_QUEUE", - "queuePriority": "Normal", - "queueSize": "0" - }, - { - "queue": "QUANTUM_TASKS_QUEUE", - "queuePriority": "Priority", - "queueSize": "0" - }, - { - "queue": "JOBS_QUEUE", - "queueSize": "0" - } - ], - "deviceStatus": "ONLINE", - "deviceType": "SIMULATOR", - "providerName": "Amazon Braket" - }) + mocker.set_get_device_result( + { + "deviceArn": "arn:aws:braket:::device/quantum-simulator/amazon/sv1", + "deviceCapabilities": mock_utils.read_file("1_pennylane_capabilities.json", __file__), + "deviceName": "SV1", + "deviceQueueInfo": [ + {"queue": "QUANTUM_TASKS_QUEUE", "queuePriority": "Normal", "queueSize": "0"}, + {"queue": "QUANTUM_TASKS_QUEUE", "queuePriority": "Priority", "queueSize": "0"}, + {"queue": "JOBS_QUEUE", "queueSize": "0"}, + ], + "deviceStatus": "ONLINE", + "deviceType": "SIMULATOR", + "providerName": "Amazon Braket", + } + ) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA_mocks.py b/test/integ_tests/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA_mocks.py index 2994ceb51..5c33cff68 100644 --- a/test/integ_tests/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA_mocks.py +++ b/test/integ_tests/pennylane/2_Graph_optimization_with_QAOA/2_Graph_optimization_with_QAOA_mocks.py @@ -1,33 +1,28 @@ -import tarfile from unittest.mock import patch -from braket.jobs_data import PersistedJobData, PersistedJobDataFormat - -from braket.jobs.serialization import serialize_values - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) mock_utils.mock_default_job_calls(mocker) mocker.set_task_result_return(mock_utils.read_file("../pennylane_results.json", __file__)) - mocker.set_start_query_result({ - "queryId": "TestId" - }) - mocker.set_get_query_results_result({ - "status": "Complete", - "results": [ - [ - {"field": "@message", "value": "iteration_number=0;cost=0;"}, - {"field": "@timestamp", "value": "0"}, + mocker.set_start_query_result({"queryId": "TestId"}) + mocker.set_get_query_results_result( + { + "status": "Complete", + "results": [ + [ + {"field": "@message", "value": "iteration_number=0;cost=0;"}, + {"field": "@timestamp", "value": "0"}, + ], ], - ] - }) + } + ) default_job_results = { - 'braket_tasks_cost': 0.0, + "braket_tasks_cost": 0.0, } mock_utils.mock_job_results(default_job_results) - patch('cloudpickle.dumps', return_value='serialized').start() + patch("cloudpickle.dumps", return_value="serialized").start() def post_run(tb): diff --git a/test/integ_tests/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE_mocks.py b/test/integ_tests/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE_mocks.py index 37901fdf1..2e536f3cc 100644 --- a/test/integ_tests/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE_mocks.py +++ b/test/integ_tests/pennylane/3_Hydrogen_Molecule_geometry_with_VQE/3_Hydrogen_Molecule_geometry_with_VQE_mocks.py @@ -6,11 +6,7 @@ def pre_run_inject(mock_utils): mock_utils.mock_default_device_calls(mocker) mock_utils.mock_default_job_calls(mocker) mocker.set_task_result_return(mock_utils.read_file("../pennylane_results.json", __file__)) - mocker.set_start_query_result( - { - "queryId": "TestId" - } - ) + mocker.set_start_query_result({"queryId": "TestId"}) mocker.set_get_query_results_result( { "status": "Complete", @@ -19,15 +15,12 @@ def pre_run_inject(mock_utils): {"field": "@message", "value": "iteration_number=0;energies=0;"}, {"field": "@timestamp", "value": "0"}, ], - ] + ], } ) - default_job_results = { - 'energies': -1.5, - "braket_tasks_cost": 0.0 - } + default_job_results = {"energies": -1.5, "braket_tasks_cost": 0.0} mock_utils.mock_job_results(default_job_results) - patch('cloudpickle.dumps', return_value='serialized').start() + patch("cloudpickle.dumps", return_value="serialized").start() def post_run(tb): diff --git a/test/integ_tests/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane_mocks.py b/test/integ_tests/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane_mocks.py index 59d17df02..f55b442ee 100644 --- a/test/integ_tests/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane_mocks.py +++ b/test/integ_tests/pennylane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane/4_Simulation_of_noisy_quantum_circuits_on_Amazon_Braket_with_PennyLane_mocks.py @@ -1,5 +1,3 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) @@ -7,4 +5,4 @@ def pre_run_inject(mock_utils): def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage_mocks.py b/test/integ_tests/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage_mocks.py index 34a3f1f47..53f2010ec 100644 --- a/test/integ_tests/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage_mocks.py +++ b/test/integ_tests/pennylane/5_Tracking_resource_usage/5_Tracking_resource_usage_mocks.py @@ -1,5 +1,3 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) @@ -7,4 +5,4 @@ def pre_run_inject(mock_utils): def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/pulse_control/1_Bringup_experiments_mocks.py b/test/integ_tests/pulse_control/1_Bringup_experiments_mocks.py index 9965f34d2..4c612ec9c 100644 --- a/test/integ_tests/pulse_control/1_Bringup_experiments_mocks.py +++ b/test/integ_tests/pulse_control/1_Bringup_experiments_mocks.py @@ -1,12 +1,14 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("rig_pulse_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file( + "rig_pulse_device_capabilities.json", __file__ + ), + } + ) res1 = mock_utils.read_file("1_1_pulse_results.json", __file__) res2 = mock_utils.read_file("1_2_pulse_results.json", __file__) res3 = mock_utils.read_file("1_3_pulse_results.json", __file__) @@ -19,4 +21,4 @@ def pre_run_inject(mock_utils): def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/pulse_control/2_Native_gate_calibrations_mocks.py b/test/integ_tests/pulse_control/2_Native_gate_calibrations_mocks.py index 3757efb93..ecf82e2b9 100644 --- a/test/integ_tests/pulse_control/2_Native_gate_calibrations_mocks.py +++ b/test/integ_tests/pulse_control/2_Native_gate_calibrations_mocks.py @@ -1,15 +1,17 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "providerName": "Rigetti", - "deviceCapabilities" : mock_utils.read_file("rig_pulse_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "providerName": "Rigetti", + "deviceCapabilities": mock_utils.read_file( + "rig_pulse_device_capabilities.json", __file__ + ), + } + ) mocker.set_task_result_return(mock_utils.read_file("pulse_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/pulse_control/3_Bell_pair_with_pulses_Rigetti_mocks.py b/test/integ_tests/pulse_control/3_Bell_pair_with_pulses_Rigetti_mocks.py index 3757efb93..ecf82e2b9 100644 --- a/test/integ_tests/pulse_control/3_Bell_pair_with_pulses_Rigetti_mocks.py +++ b/test/integ_tests/pulse_control/3_Bell_pair_with_pulses_Rigetti_mocks.py @@ -1,15 +1,17 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "providerName": "Rigetti", - "deviceCapabilities" : mock_utils.read_file("rig_pulse_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "providerName": "Rigetti", + "deviceCapabilities": mock_utils.read_file( + "rig_pulse_device_capabilities.json", __file__ + ), + } + ) mocker.set_task_result_return(mock_utils.read_file("pulse_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/pulse_control/4_Build_single_qubit_gates_mocks.py b/test/integ_tests/pulse_control/4_Build_single_qubit_gates_mocks.py index 95936e09f..451365b33 100644 --- a/test/integ_tests/pulse_control/4_Build_single_qubit_gates_mocks.py +++ b/test/integ_tests/pulse_control/4_Build_single_qubit_gates_mocks.py @@ -1,14 +1,16 @@ - - def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("rig_pulse_device_capabilities.json", __file__) - }) + mocker.set_get_device_result( + { + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file( + "rig_pulse_device_capabilities.json", __file__ + ), + } + ) mocker.set_task_result_return(mock_utils.read_file("pulse_results.json", __file__)) def post_run(tb): - pass \ No newline at end of file + pass diff --git a/test/integ_tests/qiskit/0_Getting_Started_mocks.py b/test/integ_tests/qiskit/0_Getting_Started_mocks.py index 1a353f45b..6026a5bea 100644 --- a/test/integ_tests/qiskit/0_Getting_Started_mocks.py +++ b/test/integ_tests/qiskit/0_Getting_Started_mocks.py @@ -8,44 +8,50 @@ def pre_run_inject(mock_utils): mocker = mock_utils.Mocker() mock_utils.mock_default_device_calls(mocker) - mocker.set_get_device_result({ - "deviceType" : "QPU", - "deviceCapabilities" : mock_utils.read_file("rig_pulse_device_capabilities.json", __file__) - }) - mocker.set_search_result([ + mocker.set_get_device_result( { - "devices": [ - { - "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", - "deviceName": "SV1", - "deviceType": "SIMULATOR", - "deviceStatus": "ONLINE", - "providerName": "Test Provider" - }, - { - "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", - "deviceName": "dm1", - "deviceType": "SIMULATOR", - "deviceStatus": "ONLINE", - "providerName": "Test Provider" - }, - { - "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", - "deviceName": "TN1", - "deviceType": "SIMULATOR", - "deviceStatus": "ONLINE", - "providerName": "Test Provider" - }, - { - "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", - "deviceName": "Ankaa-2", - "deviceType": "QPU", - "deviceStatus": "ONLINE", - "providerName": "Test Provider" - } - ] + "deviceType": "QPU", + "deviceCapabilities": mock_utils.read_file( + "rig_pulse_device_capabilities.json", __file__ + ), } - ]) + ) + mocker.set_search_result( + [ + { + "devices": [ + { + "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", + "deviceName": "SV1", + "deviceType": "SIMULATOR", + "deviceStatus": "ONLINE", + "providerName": "Test Provider", + }, + { + "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", + "deviceName": "dm1", + "deviceType": "SIMULATOR", + "deviceStatus": "ONLINE", + "providerName": "Test Provider", + }, + { + "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", + "deviceName": "TN1", + "deviceType": "SIMULATOR", + "deviceStatus": "ONLINE", + "providerName": "Test Provider", + }, + { + "deviceArn": "arn:aws:braket:us-west-2::device/qpu/arn/TestARN", + "deviceName": "Ankaa-2", + "deviceType": "QPU", + "deviceStatus": "ONLINE", + "providerName": "Test Provider", + }, + ] + } + ] + ) def post_run(tb): diff --git a/test/integ_tests/record_utils.py b/test/integ_tests/record_utils.py index b300890cd..daceed0e9 100644 --- a/test/integ_tests/record_utils.py +++ b/test/integ_tests/record_utils.py @@ -1,16 +1,16 @@ -import boto3 import json + +import boto3 + import braket.aws recording = True -class BraketClientWrapper(): +class BraketClientWrapper: def __init__(self, braket_client): self.__class__ = type( - braket_client.__class__.__name__, - (self.__class__, braket_client.__class__), - {} + braket_client.__class__.__name__, (self.__class__, braket_client.__class__), {} ) self.__dict__ = braket_client.__dict__ self.braket_client = braket_client @@ -61,7 +61,13 @@ def __init__(self, *args, **kwargs): def client(self, *args, **kwargs): boto_client = super().client(*args, **kwargs) - if args and args[0] == "braket" or kwargs and "service_name" in kwargs and kwargs["service_name"] == "braket": + if ( + args + and args[0] == "braket" + or kwargs + and "service_name" in kwargs + and kwargs["service_name"] == "braket" + ): return BraketClientWrapper(boto_client) return boto_client @@ -70,7 +76,7 @@ def client(self, *args, **kwargs): num_s3_results = 0 -class AwsSessionWrapper(): +class AwsSessionWrapper: def retrieve_s3_object_body(self, s3_bucket, s3_object_key): global num_s3_results if recording: @@ -85,7 +91,9 @@ def retrieve_s3_object_body(self, s3_bucket, s3_object_key): boto3.Session = Recorder -braket.aws.aws_session.AwsSession.retrieve_s3_object_body = AwsSessionWrapper.retrieve_s3_object_body +braket.aws.aws_session.AwsSession.retrieve_s3_object_body = ( + AwsSessionWrapper.retrieve_s3_object_body +) def record(): diff --git a/test/integ_tests/test_all_notebooks.py b/test/integ_tests/test_all_notebooks.py index a8c9fbacb..921f61551 100644 --- a/test/integ_tests/test_all_notebooks.py +++ b/test/integ_tests/test_all_notebooks.py @@ -1,11 +1,11 @@ import logging import os -import pytest - -from testbook import testbook -from nbconvert import HTMLExporter from importlib.machinery import SourceFileLoader + +import pytest from jupyter_client import kernelspec +from nbconvert import HTMLExporter +from testbook import testbook # These notebooks have syntax or dependency issues that prevent them from being tested. EXCLUDED_NOTEBOOKS = [ @@ -29,7 +29,10 @@ "Using_the_experimental_local_simulator.ipynb", ] -if os.environ.get("AWS_DEFAULT_REGION") == "eu-north-1" or os.environ.get("AWS_REGION") == "eu-north-1": +if ( + os.environ.get("AWS_DEFAULT_REGION") == "eu-north-1" + or os.environ.get("AWS_REGION") == "eu-north-1" +): EXTRA_EXCLUDES = [ "Quantum_machine_learning_in_Amazon_Braket_Hybrid_Jobs.ipynb", "Using_PennyLane_with_Braket_Hybrid_Jobs.ipynb", @@ -85,7 +88,9 @@ def test_all_notebooks(notebook_dir, notebook_file, mock_level): os.chdir(notebook_dir) path_to_utils, path_to_mocks = get_mock_paths(notebook_dir, notebook_file) # Try to use the conda_braket kernel if installed, otherwise fall back to the default value of python3 - kernel = 'conda_braket' if 'conda_braket' in kernelspec.find_kernel_specs().keys() else 'python3' + kernel = ( + "conda_braket" if "conda_braket" in kernelspec.find_kernel_specs().keys() else "python3" + ) with testbook(notebook_file, timeout=600, kernel_name=kernel) as tb: # We check the existing notebook output for errors before we execute the # notebook because it will change after executing it. @@ -119,10 +124,12 @@ def test_record(): pytest.skip(f"Notebook not found: '{notebook_file_search}'") os.chdir(root_path) os.chdir(notebook_dir) - path_to_utils, path_to_mocks = get_mock_paths(notebook_dir, notebook_file) + path_to_utils, _path_to_mocks = get_mock_paths(notebook_dir, notebook_file) path_to_utils = path_to_utils.replace("mock_utils.py", "record_utils.py") # Try to use the conda_braket kernel if installed, otherwise fall back to the default value of python3 - kernel = 'conda_braket' if 'conda_braket' in kernelspec.find_kernel_specs().keys() else 'python3' + kernel = ( + "conda_braket" if "conda_braket" in kernelspec.find_kernel_specs().keys() else "python3" + ) with testbook(notebook_file, timeout=600, kernel_name=kernel) as tb: tb.inject( f""" diff --git a/test/repo_tests/test_readme.py b/test/repo_tests/test_readme.py index f8e3f0116..cc96b403d 100644 --- a/test/repo_tests/test_readme.py +++ b/test/repo_tests/test_readme.py @@ -1,12 +1,12 @@ import os -import re import pathlib +import re EXCLUDED_DIRS = [ # These directories contain notebook files that should not be linked to in the README. ".ipynb_checkpoints", "7_Running_notebooks_as_hybrid_jobs/result", - "7_Running_notebooks_as_hybrid_jobs/src" + "7_Running_notebooks_as_hybrid_jobs/src", ] LINK_EXAMPLES_REGEX = re.compile(r"\(\s*(examples.*\.ipynb)\s*\)") @@ -15,14 +15,16 @@ def test_readme(): root_path = pathlib.Path(__file__).parent.parent.parent.resolve() - examples_path = (os.path.join(root_path, "examples")) + examples_path = os.path.join(root_path, "examples") root_path_len = len(str(root_path)) + len(os.pathsep) all_notebooks = set() for dir_, _, files in os.walk(examples_path): for file_name in files: if file_name.endswith(".ipynb"): - is_excluded = [excluded_dir for excluded_dir in EXCLUDED_DIRS if excluded_dir in dir_] + is_excluded = [ + excluded_dir for excluded_dir in EXCLUDED_DIRS if excluded_dir in dir_ + ] if not is_excluded: all_notebooks.add(os.path.join(dir_[root_path_len:], file_name)) @@ -32,5 +34,9 @@ def test_readme(): missing_in_readme = all_notebooks - all_readme_links extra_in_readme = all_readme_links - all_notebooks - assert extra_in_readme == set(), "There are some (dead) links in the README that do not link to a notebook: " - assert missing_in_readme == set(), "There are some new notebooks that haven't been added to the README summary: " + assert ( + extra_in_readme == set() + ), "There are some (dead) links in the README that do not link to a notebook: " + assert ( + missing_in_readme == set() + ), "There are some new notebooks that haven't been added to the README summary: "