Skip to content

Instantly share code, notes, and snippets.

@YumaNK
Last active July 7, 2020 23:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YumaNK/3d5de2c2e21406e25ae3331e105b4c27 to your computer and use it in GitHub Desktop.
Save YumaNK/3d5de2c2e21406e25ae3331e105b4c27 to your computer and use it in GitHub Desktop.
Quantum Support Vector Machine
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.14.1\n",
"{'qiskit-terra': '0.14.1', 'qiskit-aer': '0.5.2', 'qiskit-ignis': '0.3.0', 'qiskit-ibmq-provider': '0.7.2', 'qiskit-aqua': '0.7.1', 'qiskit': '0.19.3'}\n"
]
}
],
"source": [
"import qiskit\n",
"\n",
"print(qiskit.__version__)\n",
"print(qiskit.__qiskit_version__)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import subprocess\n",
"import time\n",
"import pickle\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib as mpl\n",
"from matplotlib import pyplot as plt\n",
"from sklearn import preprocessing\n",
"from tqdm.notebook import tqdm # jupyter用\n",
"# from tqdm import tqdm # jupyter以外用\n",
"\n",
"from qiskit import BasicAer\n",
"from qiskit.circuit.library import ZZFeatureMap\n",
"from qiskit.ml.datasets import ad_hoc_data, breast_cancer\n",
"from qiskit.aqua import aqua_globals, QuantumInstance\n",
"from qiskit.aqua.utils import split_dataset_to_data_and_labels, map_label_to_class_name\n",
"from qiskit.aqua.algorithms import SklearnSVM\n",
"from qiskit.aqua.algorithms import QSVM"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# prepare mesh for prediction"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"feature_dim = 2 # 特徴量の数\n",
"training_dataset_size = 20\n",
"testing_dataset_size = 10\n",
"\n",
"# 予測データの設定\n",
"size = 50 # 50x50のメッシュを分類によって色分けし、擬似的に境界面を可視化する\n",
"mesh_list = [[2*i/size-1, 2*j/size-1] for i in range(size+1) for j in range(size+1)]\n",
"\n",
"# 量子コンピュータのパラメータ設定\n",
"shots = 1024\n",
"seed = 10598"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"def eval_model(pred_label, print_mode=True):\n",
" test_label = [\"A\"]*testing_dataset_size + [\"B\"]*testing_dataset_size\n",
" \n",
" accuracy = sum([x == y for x, y in zip(pred_label,test_label)])/len(test_label)\n",
" precision = \\\n",
" sum([ x == y for x, y in zip(pred_label,test_label) if x == \"A\"])/sum([x == \"A\" for x in pred_label])\n",
" recall = \\\n",
" sum([ x == y for x, y in zip(pred_label,test_label) if y == \"A\"])/sum([y == \"A\" for y in test_label])\n",
" specificity = \\\n",
" sum([ x == y for x, y in zip(pred_label,test_label) if y == \"B\"])/sum([y == \"B\" for y in test_label])\n",
" f1 = 2*recall*precision/(recall + precision)\n",
" eval_dict = {\"accuracy\":accuracy, \"precision\": precision, \"recall\": recall, \"specificity\": specificity, \"F1-measure\":f1}\n",
" if print_mode:\n",
" print(\"result: \", pred_label)\n",
" print(\"truth : \", test_label)\n",
" eval_dict_print = {k:round(v,2) for k,v in eval_dict.items()}\n",
" print(eval_dict_print)\n",
" else:\n",
" return eval_dict\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# define visualization"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"def heatmap(pred_list, size=50):\n",
" mat = np.flipud(pred_list.reshape(size+1, size+1, order='F'))\n",
" centers = [-1, 1, -1, 1]\n",
" dx, = np.diff(centers[:2])/(size)\n",
" dy, = -np.diff(centers[2:])/(size)\n",
" extent = [centers[0]-dx/2, centers[1]+dx/2, centers[2]+dy/2, centers[3]-dy/2]\n",
" cmap = mpl.colors.ListedColormap(['orange', 'cyan'])\n",
" # ヒートマップ表示\n",
" plt.imshow(mat, interpolation='nearest', vmin=0, vmax=1, cmap=cmap, extent=extent)\n",
"\n",
"\n",
"def scatter_data(train_for_pred, test_for_pred, train_result, test_result,\n",
" yshift=-0.155, print_index=False):\n",
" dataset_dict = {\"train\": train_for_pred, \"test\": test_for_pred}\n",
" result_dict = {\"train\":train_result, \"test\":test_result}\n",
" marker_dict = {\"train\": \"o\", \"test\": \"s\"}\n",
" \n",
" for data_type in [\"train\", \"test\"]:\n",
" data_num_half = int(len(dataset_dict[data_type])/2) # ラベルA/Bのデータ数が1:1と仮定とする\n",
" for label in [\"A\", \"B\"]: \n",
" if label == \"A\":\n",
" (plot_data, color) = dataset_dict[data_type][:data_num_half], \"red\"\n",
" elif label == \"B\":\n",
" (plot_data, color) = dataset_dict[data_type][data_num_half:], \"blue\"\n",
" plt.plot(plot_data[:,0], plot_data[:,1], marker_dict[data_type], color=color, markersize=10)\n",
" \n",
" # 誤分類を×マークでプロット\n",
" for i, pred_label in enumerate(result_dict[data_type]):\n",
" if (i < data_num_half and pred_label != 0)\\\n",
" or (i >= data_num_half and pred_label != 1): \n",
" if print_index:\n",
" plt.text(dataset_dict[data_type][i][0], dataset_dict[data_type][i][1], str(i), \n",
" color=\"white\", size=15, fontweight='bold')\n",
" # ↓ x方向は自動、y方向は手動にてプロットの位置の微調整が現状ベスト\n",
" plt.text(dataset_dict[data_type][i][0], dataset_dict[data_type][i][1] + yshift, \"×\", \n",
" horizontalalignment='center', color=\"white\", size=15, fontweight='bold')\n",
" plt.axis('off')\n",
" plt.title(\"Classification Boundary\", size=15)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# prepare datasets_Breast_cancer"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sample_Total, training_input, test_input, class_labels = breast_cancer(\n",
" training_size=training_dataset_size, test_size=testing_dataset_size,\n",
" n=feature_dim, plot_data=True # ,gap=0.3 # breast_cancer使用時はgapパラメータを削除\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Classical SVM"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"kernel matrix during the training:\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"testing success ratio: 0.85\n"
]
}
],
"source": [
"result = SklearnSVM(training_input, test_input, mesh_list).run()\n",
"print(\"kernel matrix during the training:\")\n",
"kernel_matrix = result['kernel_matrix_training']\n",
"img = plt.imshow(np.asmatrix(kernel_matrix), interpolation='nearest', origin='upper', cmap='bone_r')\n",
"plt.show()\n",
"\n",
"print(\"testing success ratio: \", result['testing_accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"result: ['B', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']\n",
"truth : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']\n",
"{'accuracy': 0.85, 'precision': 1.0, 'recall': 0.7, 'specificity': 1.0, 'F1-measure': 0.82}\n"
]
}
],
"source": [
"# モデル評価\n",
"\n",
"# 誤分類チェックのためにtraining/testデータを予測データとして利用\n",
"(train_for_pred, _), _ = split_dataset_to_data_and_labels(training_input)\n",
"(test_for_pred, _), _ = split_dataset_to_data_and_labels(test_input)\n",
"train_result = SklearnSVM(training_input, test_input, train_for_pred).run()\n",
"test_result = SklearnSVM(training_input, test_input, test_for_pred).run()\n",
"\n",
"eval_model(test_result[\"predicted_classes\"])"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(7, 7)) \n",
"heatmap(result[\"predicted_labels\"])\n",
"scatter_data(train_for_pred, test_for_pred, train_result[\"predicted_labels\"], test_result[\"predicted_labels\"],yshift=-0.014)\n",
"plt.show()\n",
"\n",
"# 赤がA、青がBのラベル。●が訓練データで、■がテストデータ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quantum SVM"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 45.4 s, sys: 2.45 s, total: 47.9 s\n",
"Wall time: 4min 1s\n"
]
}
],
"source": [
"%%time\n",
"backend = BasicAer.get_backend('qasm_simulator')\n",
"feature_map = ZZFeatureMap(feature_dim, reps=2)\n",
"svm = QSVM(feature_map, training_input, test_input, None) # the data for prediction can be fed later.\n",
"svm.random_seed = seed\n",
"quantum_instance = QuantumInstance(backend, shots=shots, seed_simulator=seed, seed_transpiler=seed)\n",
"result = svm.run(quantum_instance)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"kernel matrix during the training:\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"testing success ratio: 0.8\n"
]
}
],
"source": [
"print(\"kernel matrix during the training:\")\n",
"kernel_matrix = result['kernel_matrix_training']\n",
"img = plt.imshow(np.asmatrix(kernel_matrix),interpolation='nearest',origin='upper',cmap='bone_r')\n",
"plt.show()\n",
"\n",
"print(\"testing success ratio: \", result['testing_accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"result: ['A', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'A', 'B', 'B', 'B', 'B', 'A', 'A', 'B', 'B', 'B', 'B']\n",
"truth : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']\n",
"{'accuracy': 0.8, 'precision': 0.8, 'recall': 0.8, 'specificity': 0.8, 'F1-measure': 0.8}\n",
"CPU times: user 1min 1s, sys: 2.29 s, total: 1min 4s\n",
"Wall time: 4min 34s\n"
]
}
],
"source": [
"%%time\n",
"train_result = svm.predict(train_for_pred)\n",
"test_result = svm.predict(test_for_pred)\n",
"\n",
"# モデル評価\n",
"eval_input = [\"A\" if x == 0 else \"B\" for x in test_result]\n",
"eval_model(eval_input)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"# 大量の予測データセットに対して実行する場合、terminal上で複数タブにて同時に実行する方が(若干)早い\n",
"# ただし、並列化するほど1つあたりの処理が大幅に遅くなるので、劇的な高速化はできない\n",
"(input_file_num, iter_num, input_size) = (3, 51, 17)\n",
"mesh_list_tmp = np.array(mesh_list).reshape(input_file_num, iter_num, input_size, feature_dim)\n",
"\n",
"\n",
"code_string = '''\n",
"import os\n",
"import pickle\n",
"from tqdm import tqdm\n",
"\n",
"dir = os.path.dirname(os.path.abspath(__file__))\n",
"with open(dir+\"/../model/model_qsvm_br_cn.pkl\", \"rb\") as f:\n",
" svm = pickle.load(f)\n",
"\n",
"with open(dir+\"/../input/input_INDEX.pkl\", \"rb\") as f:\n",
" input_array = pickle.load(f)\n",
"\n",
"list_final = []\n",
"for epoch, epoch_array in enumerate(tqdm(input_array)):\n",
" pred_tmp = svm.predict(epoch_array)\n",
" print(\"epoch \", epoch, \" has done\")\n",
" list_final.append(list(pred_tmp))\n",
"print(list_final)\n",
"\n",
"with open(dir+\"/../output/output_br_cn_INDEX.pkl\", \"wb\") as f:\n",
" pickle.dump(list_final, f)\n",
"'''\n",
"\n",
"for path in ['./qsvm_terminal/' + folder for folder in [\"input\", \"output\", \"script\", \"model\"]]:\n",
" os.makedirs(path, exist_ok=True)\n",
"\n",
"with open(\"qsvm_terminal/model/model_qsvm_br_cn.pkl\", \"wb\") as f:\n",
" pickle.dump(svm, f)\n",
"\n",
"for i in range(input_file_num):\n",
" # inputはbreast_cancerとad_hoc_data共通でOK\n",
" with open(\"qsvm_terminal/input/input_{}.pkl\".format(i), \"wb\") as f:\n",
" pickle.dump(mesh_list_tmp[i], f)\n",
"\n",
" with open(\"qsvm_terminal/script/predict_br_cn_{}.py\".format(i), \"w\") as f:\n",
" f.write(code_string.replace(\"INDEX\", str(i)))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"# terminal上で predict_br_cn_1.py, predict_br_cn_2.py, predict_br_cn_3.pyをそれぞれ実行する"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"mesh_predict_tmp = []\n",
"for i in range(input_file_num):\n",
" with open(\"qsvm_terminal/output/output_br_cn_\"+str(i)+\".pkl\", \"rb\") as f:\n",
" mesh_predict_tmp.append(pickle.load(f))\n",
" \n",
"mesh_predict_result = np.array(mesh_predict_tmp).reshape(-1)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [],
"source": [
"# 時間かけてでもjupyter上で実行したい場合は以下のコードで実行可能\n",
"# (iter_num, input_size) = (51*3, 17)\n",
"# mesh_list_iter = np.array(mesh_list).reshape(iter_num, input_size, feature_dim)\n",
"\n",
"# mesh_predict_tmp = []\n",
"# for i, iter_list in enumerate(tqdm(mesh_list_iter)):\n",
"# tmp_list = svm.predict(iter_list)\n",
"# mesh_predict_tmp.append(tmp_list)\n",
"# print(\"epoch \", i, \" has done \",list(tmp_list))\n",
"\n",
"# print(mesh_result)\n",
"# mesh_predict_result = np.array(mesh_predict_tmp).reshape(-1)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(7, 7)) \n",
"heatmap(mesh_predict_result)\n",
"scatter_data(train_for_pred, test_for_pred, train_result, test_result ,yshift=-0.014)\n",
"plt.show()\n",
"\n",
"# 赤がA、青がBのラベル。●が訓練データで、■がテストデータ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# prepare dataset_ad_hoc_data"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"aqua_globals.random_seed = seed\n",
"sample_Total, training_input_unnormalized, test_input_unnormalized, class_labels = ad_hoc_data(\n",
" training_size=training_dataset_size, \n",
" test_size=testing_dataset_size, \n",
" n=feature_dim, gap=0.3, plot_data=True\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# Breast_cancerと同じスケール(-1, 1)でプロットするためにdatasetを規格化\n",
"(train_for_pred, _), _ = split_dataset_to_data_and_labels(training_input_unnormalized)\n",
"(test_for_pred, _), _ = split_dataset_to_data_and_labels(test_input_unnormalized)\n",
"dataset_array = np.vstack([train_for_pred, test_for_pred])\n",
"min_array, max_array = dataset_array.min(), dataset_array.max()\n",
"training_input_normalized = {k:(v-min_array)/(max_array-min_array)*2-1 for k,v in training_input_unnormalized.items()}\n",
"test_input_normalized = {k:(v-min_array)/(max_array-min_array)*2-1 for k,v in test_input_unnormalized.items()} "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Classical SVM"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"kernel matrix during the training:\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"testing success ratio: 0.7\n"
]
}
],
"source": [
"result = SklearnSVM(training_input_normalized, test_input_normalized, mesh_list).run()\n",
"print(\"kernel matrix during the training:\")\n",
"kernel_matrix = result['kernel_matrix_training']\n",
"img = plt.imshow(np.asmatrix(kernel_matrix), interpolation='nearest', origin='upper', cmap='bone_r')\n",
"plt.show()\n",
"\n",
"print(\"testing success ratio: \", result['testing_accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"result: ['A', 'B', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'A', 'B', 'B', 'A', 'B', 'A', 'A']\n",
"truth : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']\n",
"{'accuracy': 0.7, 'precision': 0.64, 'recall': 0.9, 'specificity': 0.5, 'F1-measure': 0.75}\n"
]
}
],
"source": [
"# モデル評価\n",
"\n",
"# 誤分類チェックのためにtraining/testデータを予測データとして利用\n",
"(train_for_pred, _), _ = split_dataset_to_data_and_labels(training_input_normalized)\n",
"(test_for_pred, _), _ = split_dataset_to_data_and_labels(test_input_normalized)\n",
"train_result = SklearnSVM(training_input_normalized, test_input_normalized, train_for_pred).run()\n",
"test_result = SklearnSVM(training_input_normalized, test_input_normalized, test_for_pred).run()\n",
"\n",
"eval_model(test_result[\"predicted_classes\"])"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAGcCAYAAADH8eeWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3df5SddX3g8fc34wwJxEnsqokHsZq0tFUa4h71tAaquDUmQ2nFxJYN4WcBa9BGzHYX212ObmuhSkjjibSFqCABXI1oTZtQ0orNEtdW3YX4s22G5ezikiBVYob8mGF49o/vM+Tmzsxzf8zz3Hufe9+vc+65c5/nO/f5zp2Z+7nfX59vSJIESZKmM6vdFZAkdTYDhSQpk4FCkpTJQCFJymSgkCRlMlBIkjIZKEouhPCOEMKXQwhPhxCOhxD+OYTwRyGEF6fnXxlCSEIIv9biej0WQri56tgNIYQfhBCeCyHcEUJ4c1q3s3K+9vIQwvumOH5HCOEbeV6rRj3uSH++idvhEMLXQwjvaFUdGhFCuDmE8Fi766HO84J2V0DNCyFsBN4HfArYBPwEeDXwO8BrgAvbVzsuBP514kEI4XXAh4DfB74CPAn8EPhlYDjnay8HVgN/WnX8D4E5OV+rlu8DV6RfDwKXA58LIbwpSZKHWlwXqSkGipIKIVwAvB/47SRJPllx6u9DCLcR3yzbJkmS/1V16OfT+48nSfKTiuNfa1GVSJIk74BUj2eSJHn+Zwwh/C1wHvDrQFcGihDCnCRJjra7HsqPXU/ldR3wP6uCBABJkownSbJrum8MIVwaQngohPCjEMKPQwgPpp/4K8u8JoRwf1rmmRDC90II11acPyeE8N9DCD9Jbw+HEN5Zcf75rqcQwh3AXempQ2k3zJun6noKIfSFED6QdqEdDyE8nn7/xPnzQwi7QwhPptf9WghhecX5DwIbgJ+u6PK5Y6Ie1V1PIYSlIYS/CyEcSV+Lu0MICyrOT3Td/WYI4S9CCIfSOn0ohNDw/0+SJM8BR4D+BusxZTddCOErIYTtFY/vCCF8I4Tw1hDCvvR391AI4TVV3zc/hHBPev6JEMIfVNc1hPCyEMInQwiPhhCOVnRrDkzx+lwcQvh0COFpYEcI4aPp94Wq57wihDAa0q5RlYMtihIKIfQDbwQ2NvkUrwQ+TezyGQDWAHtCCGclSfJoWuZLxG6TtcBx4OeIXSeEEAaBvwL+EvivQAB+EZg/zfX+EPi/wH8G3gIcBb4L/Nspyv4FcCnwEeDvgZ8idiNNeBWwA7gZeA5YCewKIfxKkiR7ga3Az6bXmeh6++FUlQohvITYDfa99DWYC9wE7A4hvC5JktGK4h8BPp/W5d8BNwDfAT47zc9ceZ2J/7NB4Eri6/+XTdajHq8APgp8mPha3wx8Nv39TuTs+RTwZmLX5QHgPwCLgWcrnufFwI+ILdcfA2cCHwReAryr6po3A/cB7wTGgR+kz/mm9GebcDmwI0mSpxr8mdROSZJ4K9kNWAgkwLvqKPvKtOyvTXN+FvEDw/eBG9JjL06/5xen+Z7XpedfmHHdx4CbKx5fnn7P3Ipjb06PnZU+/vn08e/W+TpM1P1vgE9WHL8ZeGyK8ncA36h4fBPwNDBYcewNaR3+fdXr9+mq53oY+EyN+t2Rfm/lbRzYUFWunnqc9FpVlPsKsL3qms8CP1tx7O3p9/58+vg16ePfqigzlxgUJr1uFWVeQAxkx4CBqtfnC1OUfwi4s+LxImJwn/Jv0Vvn3ux6KremMjqGEH4hhPCFEMJB4hvXGLHFcGZa5EfEFsCfhxB+K4Tw0qqnGAZGgHtCCL8RQpiuJdGo89L7OzLq/vIQwp0hhB8Q3xDHiOMxZ073PRneADyQVIyZJEnyj8Qgd05V2QeqHn8XeHkd1/ge8Pr09iZiS+TDIYTLm6xHPR5LkuRfqupKRX1fn95/qeJ6I8DuyicJ0ftCCN8NIRwlvtZ3A6cQWy2V/nqKenwCWBVCmJs+vhw4CNzf2I+jdjNQlNO/EruDqv9ZawohvJD4pncGsUvhXOIbxyPAbHi+H305sUvik8CBdDziten5H6fn+4ldLz8MIfx1CGHRDH+uf0Mc/P3JVCfTMYEvEbvdbiAGltcDuybq3qCXEd+4qh0kdnlVerrq8Wid1zySJMk30tueJEk+DNwOfKSi/76RetRjqrpSUd+FwOFk8oDzk1WP30fs3vwC8BvEgDYxTlX9s09V/88SWxC/mf6slxJbZs9OUVYdzEBRQkmSjAF7gbc18e2/TPxkuTZJkruTJHkoSZJvAPOqrvH9JElWEccdfpX4xvDXEwO4SZL8jyRJVqTn30H8RH9Psz9T6l+B09IxkKn8DPBa4L1JknwiSZK/T+ve7JTXJ4Dq1hLAAmKrqijfJfbzTwzo1lOPY+n9QFWZZgLJAeCFIYTq1626Du8EPpckyR8kSfJAkiRfB56Z5jkntW6TJHkG+AyxJfEW4KfJaC2qcxkoyutPgdeFEC6rPhFCmBVCWDHN9028ORyvKP9GYl/zJEmSjCVJ8mXgFuIn3/lV548mSbKD2PJ4daM/RJUvp/eXTnN+qrr/NLCsqly9n/b/AXhb2sqaeL7XE1+LIqeunkUcZJ5YZ1JPPR5P73+hoswZxC7DRn09vf/1iueaC7y1qtwcKl7r1MUNXusTxFbrB4GvJUnyvQa/Xx3AWU8llSTJjhDCLcAnQgjLiLNoRogDwr9D7N+eqi/4a2m520MIHyG2Lj5InKUCQAhhCXFA+L8BjwIvAv4T8EiSJD8KIZxPnL3zReD/AKcTZ8F8mRlIkuSfQlwDsjEdF9lDDEyrkyS5iDjg/nh6/r8ALyQu4vtB1VN9H1iQjgN8G3gqSZLHprjkLcC7gb8JIfwJJ2YbfYs4wykPp4UQfin9eg7xTfNq4Na0i6+ueiRJ8ngI4evAH4YQjhA/5P0+TbR8kiT5TgjhS8Cfpa23J4DfI07brbQb+N0Qwj8Qx6UuJrbqGrnWP4QQvkMca6meKaWyaPdoureZ3YBVwIPAIeIn6X8mvskvTM+/kqpZT8AK4hvoUWAfMETF7BliF8RdxCBxjNhVcS/wivT8zwHbiQPex4lv3n8O/FTFNR6jwVlP6bE+4hvgo+nP8zjwqYrzrwf+Ma37v6TPewcnz2aaTZz++WT6/Hekx08qlx57LTHAHSH27d8DLKg4P+n1m+65pvjd3MHJM54mpgVfTzprqN56pGV+Jv09PQP8E3Hc4PnfW8bPONXfwIuI3ULPEMcXbqBqthgxYH2KGIx+RJx6/GuVv7PpXp+q6/9R+nMNZr1e3jr3FtJfpCQVIoTwj8A/JUlySbvroubY9SSpECGu9n8LsRV4bY3i6mAGCklF+TqxG+0DSZwxpZKy60mSlMnpsZKkTNldT/cEmxtSgcIa/8XKLLkn1C7UyMqTu5uuSj7WJFP+QLYoJEmZDBSSpEwGCklSJgOFJCmTgUKSlMlAIUnK5MpsqY2yplc6dVadwhaFJCmTgUKSlMlAIUlF+lXiLitZ+tJyHcpAIUlFGqK+QDHUgro0yUAhSUVaAKwHBpgcMPrS4+vTch3KWU+SVLSlxF3QdwJ7iRsMzwaWEVsSHRwkwEAhSa2xALgivZWMgUKSplFXGvEe4BiFJBVt/tnwindOPj5rAF79AQid/VZsi0KSihT64Fe+AHNOh2dH4P/tSo/PgmWfgTMuhOeOw/dvaW89M3R2GJOkklv47sdZ/o5XcfzZAY68YSfn/llCuDjhztFxOONC9u6FU8/ZyMJ1T7S7qtMyUEhSgQ4eWsju3bBmDQwMwI4dcO+9cNll8MgjcP75cPRoLNepDBSS1AL33QdXXw3z58NFF8H+/bB8ORw61O6a1WagkKQWGRw88fUpp8Ds2e2rSyMczJY6VK2pmaYhz0erpsBefjls2gRPPQVf/CJcdRXs3g3nngtPPtmSKjTNQCFJBVu1Cm6/HUZGYMUK+OY34fhxuPZaeOABeNObOrsLyq4nSSpQXx/ceCOMjsIFF8QgAfCe98Cdd8LZZ8eB7U5mi0KSCjQ+DkNDsGgR7Nlz8rkrr4SvfhVuu609dauXgUKSCrZ/f7xVe+65zg8SYNeTJKkGA4UkFWjBvAO5lmsHu54kqUAHbn1Zu6swY7YoJEmZDBSSpEwGCklSJgOFJCmTgUKSlMlAIUnKZKCQJGVyHYVUUlnpsU1BfkKr0oh3M1sUkqRMBgpJUiYDhSQpk4FCkpTJQCFJymSgkCRlMlBIkjK5jkJS6blWoli2KCRJmQwUkqRMBgpJUiYDhSQpk4FCkpTJQCFJyuT0WKkL1Zou2lQa8mFgI7ANGAHmAmuBDcDixp+uEU5/bS9bFJJq2wUsAbYCh4Ekvd+aHt/VvqqpeAYKSdmGgdXAEWCs6txYenx1Wk5dyUAhKdtGJgeIamPAphbURW1hoJCUbRv1BYq7WlAXtYWBQlK2kZzLqXQMFJKyzc25nErHQCEp21qgv0aZfuCSFtRFbeE6CknZNgB3kj1O0Q9c53qHbmWLQlK2xcB24FQmtyz60+PbKXzRndrHQCGptpXAPuAaYJD4zjGYPt6XnlfXsutJUn0WA1vSm3qKLQpJUiYDhSQpk4FCkpTJMQqpC9VKI+40VjWiZoti+OAi1n1qC4NXPc2si8cZvOpp1n1qC8MHF7WifpKkNgtJMv0nj13/cWWyevN2xsb7GRsfeP54f98o/X1jbF+/mpVL729FPSU1wBaFmrImmfIPIzNQnHbKM8mR0dOmPX/qwDPsu2kJixc8OvMKSsqNgUJNmSZQZI5RjI1nJ3gZG+9n087r2HLFe2dQM0mNWrjuCQ4eWjh9gYvT+wXAgVbUSN0sc4yisrtpuvN37TUTmNRqmUHipILF1kO9YcbTY0eOmVtYkrrZjAPF3NnuViJJ3Sx7HUU/mamF+/tGuWSZ+x+qt9UaOC7ExbWLZMmqswPdqpbdoqixWUl/3xjXDbmjuiR1s+xAkZGD/tSBZ9i+frVTYyWpy2V3PU3koN8E3EXcPH0ucAnsW+z6CUnqBZkL7gJMe9J+TLXdd4BPA49XHHs5cCnwmtZVoy1jFI38+zVYPf+3e9g0C+7MHqtyug/4Y04OEqSP/zg9LykXBgqVz3eAz9co8/m0XLdakHM5KUPTacbNJaO2+XTtIgnwrS+dxdkf/lbh1WkL03KohWxRqHyqu5umEIBf/Pa3C6+K1AsMFJKkTAYKSVImA4XK5+W1iyTAt846q/CqSL3APbNVPpcSp8DWsH7z5sKrotRBYCewFzgKzAGWAUM486oL2KJQ+bwGWDX1qSS93fChD/GVt7ylhZXqYQ8D1wMPEoME6f2D6fGH21Qv5cZAoXJ6B/D7nNQNNdHd9Ja/+zv+6IYb2lSxHnMQ2AyMAuNV58bT45txA6WSs+tJLZV7uosP5/t0atBOJgeIauNpuSuKr46KYYtCUvP2Ul+g2NuCuqgwBgpJzTtauwgAxwqthQpmoJDUvDl1lptdaC1UMAOFpOYtA/pqlOlLy6m0DBSSmjdEfYFiqAV1UWEMFJKatwBYDwwwOWD0pcfX46K7kmt6h7uZMAV552vLrm3qCE39f1auzD5GHJNwZXb5TLPD3czXUQwDG4FtnNhTey2wAVg842eXVAYLiOskXCvRlWbW9bQLWAJsBQ4T2x+H08dL0vOSpFJrPlAMA6uBI8BY1bmx9PjqtFwvmX82vOKdk7+eNQCv/gCEWSd/LUkdrvmup41MDhDVxoBNwJamr1IuoQ9+5Qsw53R49ii87mPp10dg8W/DGRdCMgovXha/fu44fP+WdtdakjI1/5F2G/UFiruavkKpLFz3BGHNsyx/x6s4/uwAR96wg/ffEL9+9py/gjMuZO9e2Padm5//+tRzNrJw3RPtrrokZWo+UIzkXK7kDh5aCMDu3bBmDQwMwA03wNe/Di94AYyPw4EDsHYtPPIInH8+HD164vskqVM1Hyjm5lyui9x3H1x9NcyfD+ecAwcPQl8frFoF+/fD8uVw6FC7aylJ9Wl+jGItcXZTVvdTP3DJ5MO15uh3wzqLwcETXw8MnPj6lFNgdo55b1zvIKlozbcoNhADQZZ+4Lqmr1Bal18OmzbBU0/Bnj3wohfFrqe774YzzojdUy99abtrqVJbCIQ6bvZsKgfNB4rFwHbgVCYHjP70+HZ6btHdqlVw++0wMgIf/Si88Y0wOhq7ns46K54780x44AGYN6/dtVVp1btjnDvLKQczm8i/EtgHXAMMps82mD7el57vIX19cOONMTC8/e1w1VXx67e+Fe68E84+G7797RNfX3ZZu2ssSbXNPIXHYuI6iV5ZK5FhfByGhmDRInjwwRNf79kDDz0EX/0q3HYbzJp14mtJ6nRtSQpYSxkHs8PFzb9Uyd3N/7wOZveoRv5kGvwTKeP/n3IyTVJAc0hIkjLNvOupAFmfkjv1086CeQeaWjy3YN4BWwWSOlpHBooyOnDry5r+3tCeHr7uZwp8NapyX42jxD3B3VfDrid1KVPgq1EPA9cDDxKDBOn9g+nxh9tUrw5goFD3MQW+GnUQ2AyMAuNV58bT45vp2XUpBgp1n0ZS4JdVvd0gPdxd0pCdTA4Q1cbTcj3IQKHu0wsp8A8Qu9Nq3Q60q4Ils5f6AsXeFtSlAxko1H1Mga9GHa1dBIBjhdaiYxko1H1Mga9GzamzXI6Zn8ukdNNjOzVFuWshOsgMUuCrRy0jzm7K6n7qS8v1IFsU6j6mwFejhoiBIEtfWq4HGSjUfUyBr0YtANYDA0wOGH3p8fX07CwyA4W6kynw1ailwE3AecQxi5Den5ceX9q+qrVbR2aPnQnHKKSZ6dR8amoBs8dKkpphoJAkZSrd9Nha7AKSpHzZopAkZTJQSJIyGSgkSZkMFJKkTAYKSVImA4UkKVPXTY+VpEa0a0p9mVbA26KQJGUyUKizDQPrODmx37r0uKSWMFCoc+0ClhA3ITpMTFF5OH28JD0vqXAGCnWmYWA1cITJO9WNpcdXY8tCagEDhTrTRrK3MiU9v6kFdZF6nIFCnWkb9QWKu1pQF/Uux8gAA4U61UjO5aRGOUb2vK7b4U5dYpD4T1lPuUMF16ULlWkOf9GmXEcxTAwGRzK+8VTitroF7L3ett+PO9ypVNYC/TXK9AOXtKAu6j2OkZ3EFoU6U5s/0XW7ln1iXUd9Lb55wK0F12UaU7Yo2tyitUUh1WMxsJ0YDKpbFv3p8e0YJDpdvW+indZ96BjZSQwU6lwriS2Gazh51sk16fGV7auautzcnMuVnIFCnW0xsIX4iXM8vd+CLQkVyzGykxgoJKnaBuoLFNe1oC4dwEAhSdUcIzuJgUKSpuIY2fPcuEiSpjMxRral3RVpL1sUkqRMBgpJUiYDhaTizMu5nNrCMQqpzIaJeYm2EVcJzyWuAdhAZ8zIaUdajoPATmAvcBSYAywDhoAFbahPF7BFIZWVabAnexi4HniQGCRI7x9Mjz/cpnqVnC0KqYwqt4qtNhZvp779GfbdtITFCx5tbd3a5SCwGRid4tx4etsM3IQtiwbZopDKqI402GPj/Wza2SNLhyF2N43XKDOellNDDBRSGdWxVezY+AB37e2RZEQQxyTqCRR7W1CXLmOgkMqozvTWI8d6JL0pnBiTqOVYobXoSgYKqYzqfP+fO7tHNkyAOLupHrMLrUVXMlBIZVRHGuz+vlEuWXZXS6rTEZYBfTXK9KXl1BADhVRGdaTB7u8b47qhHtnUGeI6iXoCxVAL6tJlnB4rldFi2HntSlZv3s7YeD9j4wPPn+rvG6W/b4zt61f3ztRYiFNe1xOnwE5Mh53Ql97WU4qpsVPu412h1Xtq26KQSmrl0vvZd9MSrjnvNgbnHGJWGGdwziGuOe829t20hJVL7293FVtvKXGdxHnEMYuQ3p+XHl/avqqVWUiS6SNXiGs9JXWgVn+q7Fa1Pr13osJ+92uSKZ/YFoUkKZOBQpKUyUAhScpkoJAkZTJQSJIyGSikKZwNvHOK4wPAB/AfR73FBXdSlT7gC8DpxNx7E/v/zAI+A1wIHAduaUvtpNbzg5FU4YmFC3k2BF61fDkDx4+z88gRknPPJQmB8Tvv5EKAvXv5vVe9qt1VlVrGQCFVWHjwYPxi925YswYGBmDHDrj3XrjsMnjkETj/fBY+9lhb6ym1koFCms5998HVV8P8+XDRRbB/PyxfDocOtbtmUksZKKQsg4Mnvj7lFJjtZgbqPQYKaTqXXw6bNsFTT8HWrXDGGbFL6qUvbXfNpJbqyFlPM0l4VcYEX+pAq1bB7bfDyAisWAHf/CYcPw7XXgsPPABvelPhVTDpnzpFRwYKqa36+uDGG2F0FC64IAYJgPe8B+bOjYPal13W3jpKLWTXk1RtfByGhuDCC2HPnpPPXXklvOtd8LGPtaduUhvYopCmsn9/vFV77jm47bbW10eqdBDYCewFjhI3Z1pG3Oa1gB38DBSSVCIrdu2C6zl5u9ejwIPAHuJ2rznv5GfXk1ThwIL6Po7VW07K06LhYbavXg2jnLwnOOnjUeKe4Qfzva4tCqnCyw4caHcVpGm9f+NG+sfGsguNE7ulrsjvurYoJKkk1m7bxkA9gWJvvtdtS4uiyPnhrsFQmbhWQo144chIfQWP5XtdWxSSVBKH586tr2DOmWYMFJJUy0IgNHhbmH81tq1dy2h/f3ahPuJU2RwZKCSplmZmEeU88wjglg0bGKsnUAzle10DhSSVxKOLF7N6+/a4J29f1ck+4vH15L7ozumxklQi969cCTdxYmX2MeKYhCuzJamHDQMbgW3ACAzOfpq1y7ax4cO3sHjBo4VfPiTJ9FNCAzQ9X7Tbpv05dVZF6Lb/kzKq63+72V9THm8bu4DVwFh6S/X3jdLfN8b29atZufT+HC4ErEmm/Ekdo5CkTjVMDBJHOClIAIyND3Bk9DRWb97O8MFFhVbDQCFJnWojkwJEtbHxfjbtvK7QahgoJKko64itgmZto45AMcBdey+ZwUVqM1BIUlG2AkuI4wzNqDNjx8ixOldsN8lAIUm1NDvldIw4vrCa5loWdb7/z51dZ0RpkoFCkmo5QJzBNNXt3UCNxdKMAZuauO7a2s/d3zfKJcvuauLJ62egkKSZqGMcgTGgmffyDdQRKMa4bqiZKFS/phfcOf9bqs3/k/YrfA1Uvb0+zfQOLQa2U3MdRdGL7mxRSNJM1DuO3Ox480pgH3ANMAjMgsE5h7jmvNvYd9OS/BbbZTCFhyTNxFri7Kas7qd+YCYzWBcDW9IbcOie+TN4ssbZopCkmahjHIF+oNg1cYUyUEjSTEyMI5zK5IDRnx7fnpYrKQOFJM3UFOMIDKaP96XnS8wxCknKQ9U4QjfJDBRO7Tuh1mthGvLe5f+Jup1dT5KkTAYKSVKmfMcoDnJiH9ejwBwK3cdVklS8/ALFw8BmYDy9QQwWDwJ7gPXA0tyuJklqkXy6ng4Sg8QoJ4LEhPH0+Oa0nCSpVPIJFDuZHCCqjaflJEmlkk+g2Et9gWJvLlcrt2Hi9oiVi3Jmul2iJBUonzGKo3WWO5bL1TpS1lz659dY7GJyuuDDxIRidxKX+Zd8BWc3cp2EOk3Wuq0i/l7zaVHMqbPc7FyuVk7DxCBxhMlZJme6XaIkFSifQLEM6KtRpi8t16s2Ut8uWMVuVCVJDcsnUAxRX6AYyuVq5VTkdolTaeVYiOMuUlfLJ1AsIK6TGGBywOhLj6+ntxfdFbldYrVdwBLi2Mdh4gbwE2MhS9LzeWnltSS1RX4pPJYCNwHnEccsQnp/Xnq81xfbFb1d4oRWjoU47iL1hHxzPS0AriB+mtyW3l9Bb7ckJqylvl2wZrJdIrR2LMRxF6knhCTJSI99TzB3dk6GDy5iyfX7ODJ62vSFTiVucjKTnbAGiV0/9ZQ7NIPrtPpaBXMKbLmZ5v+EGf0tr0mm/Gazx7bI4gWPsn39ak4deIb+vtGTT+a5XWIrx0JaeS1JbVNsoJh/NrzinVNcdQBe/QEIvRWnVi69n303LeGa825jcM4hZoVxBuccyne7xFaNhbT6WpLappB36oXrnuAFlyb87194mNE3fJahbQnh4njruyThC6cch6V/zAe/8+MiLt/RFi94lC1XvJdDW+czvu0FHNo6P26dmNfG660aC2n1tSY4FVdquUICxcFDCxkfh3e9C5IEtm+Hc86J5z75SbjwQti7Fz5yy2ARl+9tG6jvzfu6kl0LnIortUmhfT+7d8OaNTAwADt2wL33wmWXwSOPwPnnw9F6c0SpfouJYx2nMvlNPM+xkFZfy6m4UtsUPkhw331w9dUwfz5cdBHs3w/Ll8OhDp8FU2oriWMe13ByF02eYyGtvpZTcaW2yXcr1GkMVvQwnXIKzO7l5ICtspg49rGlS67VSAqUVvzMjXCL4M63kPo2VlsAHCi4Lh2o8EBx+eWwaRM89RR88Ytw1VWxS+rcc+HJJ4u+ejnUlaK8181wKm7b1km4RXA51Lv7Zo/u0llo19OqVXD77TAyAitWxC6oj38czjwTHngA5s0r8urqKmWciusWweoShQWKvj648UYYHYULLoBvfjMef8974M474eyz48C2VJd2TMWdKbcIVpcoLFCMj8PQUJwKu2fPyeeuvDJOnf3Yx4q6urpOq6fi5sEtgtUlCu162r8/djFVe+45uO22Iq+srtPKqbh5cYtgdYlCAsWCefVNC6i3nAS0dtpvHtwiWF2ikFlPB259WRFPK7V22u9MLSPObsrqfur1LYJVCi1ZR6Hm1ZrW2ZHTZ4eJC+S2EaerziUORm+g0K6hjksVPkScApsVKMaBv01vE+YBtxZYrxLqyL/zHtJb6VtVPPMxnZC1RXAWsxaowxgolB/zMU1WuUWwOle9K+R7dCW9gUL5MR/T1Ca2CFbnOkBs/da69ej8G8colJ8y52NSvsxv1VUMFMqPW6MKzG/Vhex6Un7KmI9J+TK/VVcyUCg/ZczHpHyZ36orZXY9Zc1d7rg56z2qo1KUbwDuJHucYgb5mPybK4FG8ltVDfC7VqJz2aJQfsqYj0n5Mr9VVzJQKF9ly8fUSvXuv1LmfVrMb9WVnPWk/F4XSR4AAArLSURBVJUpH1Mr9UJaDvNbdSVbFJLyM0TtdCV9aTmVhoFCUn6y8lv1pcfX46K7krHrSVK+JvJbTazMPkYck3BldmkZKLpYJ6Yo79oprqasONlEfitzXHUFA4U0U6asUJdzjEKaCVNWqAcYKKSZMGWFeoCBQpqJRlJWSCVloJBmwpQV6gEGCmkmTFmhHtD0rKdaUyu7dhpkF/F3lANTVtTN7LDlZYtCmglTVqgHGCikmTBlhXqAC+6kmTJlhbqcgULKgykr1MXsepIkZTJQSJIyGSgkSZkKG6OYyZzppub3m+ZZajvXSnSn7hjMNs2zJBWm/F1PpnmWpEKVP1CY5lmSClX+QGGaZ0kqVPkDhWmeJalQ5Q8Up9RZbqDQWkhS1+rIWU9ZU+wmTZ19CfB4HU/6khlVSRJOf+1VHRkoGvLDOss91cRzrwMO1VFuHnBrE88vSSVQ/q6n4zmXq1RPkGiknCSVUPkDhVtRSlKhyh8ollHfDmNuRSlJTSl/oHArSkkqVPkDhVtRSlKhyj/rCdyKUpIKVLpAkTmP+7qZPXdT6c2lEnI9hBpRukDRU2rtseEeHJJawEDRqWrtsXEBsCPjvHtwSMpJ+QezizQv53L1qmePjc/XOO8eHJJyYosiS7vSctSzx0YtE3twXDHz6kjqbbYoOlE9e2zU4h4cknJioOhE9e6xUYt7cEjKgV1PFWYyZTDXqbVzyCdYmN+qZzn9VXmyRdGJ6slfVYv5rSTlxEDRierJX1WL+a0k5cRA0YnqyV+1qsZ581tJyoljFJ2qnvxVy2qcl6QchCSZftArQGMjYsPARmAbMALMBdYCG4DFTdexFMwTpU5S6sHsHn4fycOM3ovWJFN+c35dT7uAJcBW4DAxxBxOHy9Jz0tSFt9HOlI+gWIYWA0cAcaqzo2lx1en5SRpKr6PdKx8xig2MvkXW20M2ARsyeWKHadj1mCoZ5S6e2kqvo90rHxaFNuo7xd8Vy5Xk9SNfB/pWPkEipGcy0nqPb6PdKx8AsXcnMtJ6j2+j3SsfALFWqC/Rpl+4JJcriapG/k+0rHyCRQbqO8XPMM9rSV1Md9HOlY+gWIxsB04lcm/6P70+HZcLCNper6PdKz8UnisBPYRp67dxYkVlZcQPwH4y51W1jRHp86qp/g+0pHyTeHRLToohYCBYgrrgEN1lJtH+7azbYGuW0ehXDz/ntHM/0nhKTy6hSkEOl89f/yNlJO6UY7/JwaKSqYQkKRJDBSVGkkhIEk9wkBRqRUpBIaJfYeDxFd/MH1sK0VShzJQVCo6hYDjH5JKyEBRqcgUAo5/SCopt0KttJb46T6r+6nZFAKmUFaDnP6qTmGLolKRKQRMoSyppAwUlYpMIWAKZUklZaCoNpFC4BpOnpl0TXp8ZZPPawrl/MzLuZzUjXL8P3GMYiqLieMEeY4VFDn+0Wu6OC2HlJsc/09sUbSKKZSVB9fhqA0MFK1iCmXNlOtw1CZmj221YSalUL72DVu4bmgTixc82t66qWMNH1zEkuv3cWT0tOkLnUocR/PDRtcrLKu02WM7xMT4xyFgPN5vueK9Bgll2rjz/YyN1+i7NA+ZCuJgtsqvB/an2LZ3LWPjA9mFJtbhuGBTObNFofLrgf0pRo6+sM6CxdZDvclAIZXA3DmH6yxYbD3UmwwUUgmsXbaN/r7R7EKuw1FBDBRSCWwYuoX+vhrJwlyHo4IYKKQSWLzgUbavX82pA89Mblm4DkcFc9ZTCxQ251k9ZeXS+9l30xI27byOu/Zewk+Oz4tjEpcQWxIGCRXEBXctYKAo2MUNlL27sFq0nPtV9C4X3EmSOoqBQpKUyUCh8nN/CqlQDmYXbNHwMHwK2AscBeYAy4AhYEE7a9ZFSpqWQyoLWxQFWrFrF/uWLIEHiUGC9P5B4Hrg4bZVTZLq5qynnEyahXCQGAyyFtMOADdhy0K5c0ZUubVtpqSznlpsJzGNeJbxtJwkdTDHKIqyl/oCxV7giuKrI2IrbyeOF6k7FZhu30BRlKO1iwBwrNBaaMLDwGZicJ4I4BPjRXuA9cDS9lRNykWB6fbteirKnDrLzS60FoLYkthMHC+qbuWNp8c3p+UkTWKgKMoyoK9Gmb60nIrleJE0I3Y9FWWI2KWR9QY1DvxteptKibfu7CiOF0kzYouiKAuI/d4D1G5ZTKfEW3d2FMeLpBmxRVGnpuY1LyWuk5iYaXOMOCZR7xuX8jGH+l7zLhovmsk8fNdgtEaZskrboijaAmJ3xlZgW3qv1nK8qBjDxCmZg8R3ksH08XA7K6UiGCjU/YaoL1AMtaAu3WIXsIT4wecwMYfD4fTxkvS8uoaBQt0va7yoLz2+Hhfd1WsYWA0cAaq38R5Lj6/GlkUXMVCoN0yMF51HHLMI6f156XEX29VvI5MDRLUxYFML6qITCky3b1LAOuU68NSjW3eqHGoOZg8Su5lqGcSZexk6cjDbpICScjGSczl1PKfHVujICC+1WK3/g8HZT7PozHmceSZ87nMnnxsYgA0b4E/+BJ6bW2AlS6Cb3k8MFO0wj/qzPEod5tJz72bDn7+b008PjIzArnSG06xZ8JnPwIUXwvFn4ZYj7a2n8uMYRYVu+gQgFeUlv/Mkr/2ll7BjB4yPw9veBg89BHfcAZddBnv3wlvfCkdPA37Y7tq2TynfTxyjkJSHpw6/hN27Yc2a2NW0Ywfce28MEo88AuefD0ePAk+1u6bKi4FCUlPuuw+uvhrmz4eLLoL9+2H5cjjkTKeuY6CQ1LTBwRNfn3IKzO6ifFk6wUAhqSmXXw6bNsFTT8HWrXDGGbB7N7z0pcVed9HwMFvWrePpwUHGZ83i6cFBtqxbx6Jhl4IXxUAhqWGrVsHtt8PICKxYEbugPv5xOPNMeOABmFfQjL0Vu3axb8kSrt66lXmHDzMrSZh3+DBXb93KviVLWLHLJFNF6KlZT6WchSB1mBdcmvC978Hpp8PKlbBnz4lzEzOf1q+Hj30Mkrtz/J87CFxP3Lp2OgPElCzm7WrONLOeXEchqSHj4zA0BIsWnRwkAK68Er76VbjttgIu3MiWtu5UmCu7niQ1bP/+2MVU7bnnCgoS0NiWtsqVgUJSObilbdsYKCQ1ZMG8A7mWq9ucOss5RTd3jlFIasiBW1/WngsvAx4ku/vJLW0LYYtCUjm4pW3blK5F4RRXqUdNbGm7mdiqqGxZ9KU3t7QtROkChaQeNrGl7U7i7KZjxDGJZcSWhEGiEKUJFIuGh3n/xo1wB3H2wxz845B60QLiOgnXSrRMKVZmr9i1i+2rV9M/NsbAWMWu7pXNzaVtqpwkdYtpVmZ3fKBYNDzMviVLOO1IxnZZLtuXpJkr68ZF79+4kf7KVsRUJpbtS5Jy1/EtiqcHB5l3+HDtgnOArYVXR5La7yAnBvTzHLMta1LAF46M1FfQZfuSesHDTJ4ifJS4GHEPhYzZtiVQNLQWYjb15Xhx2b6kbneQGCSmSrU+ETg2k/uYbcePUbCM+lZjumxfUrdrJNV6jjo/ULhsX5KiNqVa7/xAMbFsf4DJAaMvPe6yfUm9oE2p1jt+MBtw2b4kQZzd1IYx23IECnDZviS1KdV653c9SZKiNo3ZZi64kyR1mBBWAtuB/vQ2YSy9rSZJduV6SQOFJCmLXU+SpEwGCklSJgOFJCmTgUKSlMlAIUnK9P8Bcr+DGirLXHMAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(7, 7)) \n",
"heatmap(result[\"predicted_labels\"])\n",
"scatter_data(train_for_pred, test_for_pred, train_result[\"predicted_labels\"], test_result[\"predicted_labels\"],yshift=-0.014)\n",
"plt.show()\n",
"\n",
"# 赤がA、青がBのラベル。●が訓練データで、■がテストデータ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quantum SVM"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 40 s, sys: 1.59 s, total: 41.6 s\n",
"Wall time: 3min\n"
]
}
],
"source": [
"%%time\n",
"backend = BasicAer.get_backend('qasm_simulator')\n",
"feature_map = ZZFeatureMap(feature_dim, reps=2)\n",
"svm = QSVM(feature_map, training_input_normalized, test_input_normalized, None)# the data for prediction can be fed later.\n",
"svm.random_seed = seed\n",
"quantum_instance = QuantumInstance(backend, shots=shots, seed_simulator=seed, seed_transpiler=seed)\n",
"result = svm.run(quantum_instance)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"kernel matrix during the training:\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"testing success ratio: 0.55\n"
]
}
],
"source": [
"print(\"kernel matrix during the training:\")\n",
"kernel_matrix = result['kernel_matrix_training']\n",
"img = plt.imshow(np.asmatrix(kernel_matrix),interpolation='nearest',origin='upper',cmap='bone_r')\n",
"plt.show()\n",
"\n",
"print(\"testing success ratio: \", result['testing_accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"result: ['A', 'B', 'A', 'B', 'A', 'A', 'A', 'A', 'B', 'B', 'A', 'B', 'B', 'A', 'B', 'A', 'A', 'B', 'A', 'B']\n",
"truth : ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B']\n",
"{'accuracy': 0.55, 'precision': 0.55, 'recall': 0.6, 'specificity': 0.5, 'F1-measure': 0.57}\n",
"CPU times: user 1min, sys: 2.35 s, total: 1min 3s\n",
"Wall time: 4min 53s\n"
]
}
],
"source": [
"%%time\n",
"train_result = svm.predict(train_for_pred)\n",
"test_result = svm.predict(test_for_pred)\n",
"\n",
"# モデル評価\n",
"eval_input = [\"A\" if x == 0 else \"B\" for x in test_result]\n",
"eval_model(eval_input)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"# 大量の予測データセットに対して実行する場合、terminal上で複数タブにて同時に実行する方が(若干)早い\n",
"# ただし、並列化するほど1つあたりの処理が大幅に遅くなるので、劇的な高速化はできない\n",
"(input_file_num, iter_num, input_size) = (3, 51, 17) \n",
"mesh_list_tmp = np.array(mesh_list).reshape(input_file_num, iter_num, input_size, feature_dim)\n",
"\n",
"\n",
"code_string = '''\n",
"import os\n",
"import pickle\n",
"from tqdm import tqdm\n",
"\n",
"file_dir = os.path.dirname(os.path.abspath(__file__))\n",
"with open(file_dir+\"/../model/model_qsvm_ad_hc.pkl\", \"rb\") as f:\n",
" svm = pickle.load(f)\n",
"\n",
"with open(file_dir+\"/../input/input_INDEX.pkl\", \"rb\") as f:\n",
" input_array = pickle.load(f)\n",
" \n",
"list_final = []\n",
"for epoch, epoch_array in enumerate(tqdm(input_array)):\n",
" pred_tmp = svm.predict(epoch_array)\n",
" print(\"epoch \", epoch, \" has done\")\n",
" list_final.append(list(pred_tmp))\n",
"print(list_final)\n",
"\n",
"with open(file_dir+\"/../output/output_ad_hc_INDEX.pkl\", \"wb\") as f:\n",
" pickle.dump(list_final, f)\n",
"''' \n",
"\n",
"with open(\"qsvm_terminal/model/model_qsvm_ad_hc.pkl\", \"wb\") as f:\n",
" pickle.dump(svm, f)\n",
" \n",
"for i in range(input_file_num):\n",
" # inputはbreast_cancerとad_hoc_data共通でOK\n",
" with open(\"qsvm_terminal/input/input_{}.pkl\".format(i),\"wb\") as f:\n",
" pickle.dump(mesh_list_tmp[i], f)\n",
" \n",
" with open(\"qsvm_terminal/script/predict_ad_hc_{}.py\".format(i),\"w\") as f:\n",
" f.write(code_string.replace(\"INDEX\",str(i)))"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"# terminal上で predict_ad_hc_1.py, predict_ad_hc_2.py, predict_ad_hc_3.pyをそれぞれ実行する"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"mesh_predict_tmp = []\n",
"for i in range(input_file_num):\n",
" with open(\"qsvm_terminal/output/output_ad_hc_\"+str(i)+\".pkl\", \"rb\") as f:\n",
" mesh_predict_tmp.append(pickle.load(f))\n",
" \n",
"mesh_predict_result = np.array(mesh_predict_tmp).reshape(-1)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 504x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(7, 7)) \n",
"heatmap(mesh_predict_result)\n",
"scatter_data(train_for_pred, test_for_pred, train_result, test_result ,yshift=-0.014)\n",
"plt.show()\n",
"\n",
"# 赤がA、青がBのラベル。●が訓練データで、■がテストデータ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Depth vs Model Performance & Depth vs Time"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# jupyter上で回すとBrokenProcessPoolエラーが発生することがあるため、Terminalで実行。\n",
"\n",
"# shotsやseedをjupyter上で変更する場合は注意\n",
"code_string_depth = '''\n",
"import os\n",
"import time\n",
"import pickle\n",
"import numpy as np\n",
"from qiskit import BasicAer\n",
"from qiskit.aqua.algorithms import QSVM\n",
"from qiskit.aqua import QuantumInstance\n",
"from qiskit.aqua import aqua_globals\n",
"from qiskit.circuit.library import ZZFeatureMap\n",
"from qiskit.ml.datasets import ad_hoc_data\n",
"from qiskit.aqua.utils import split_dataset_to_data_and_labels\n",
"\n",
"# サンプリング設定\n",
"feature_dim = 2 # 特徴量の数\n",
"training_dataset_size = 20\n",
"testing_dataset_size = 10\n",
"shots = 1024\n",
"seed = 10598\n",
"\n",
"\n",
"# モデル評価\n",
"def eval_model(pred_label, print_mode=True):\n",
" test_label = [\"A\"]*testing_dataset_size + [\"B\"]*testing_dataset_size\n",
" \n",
" accuracy = sum([x == y for x, y in zip(pred_label, test_label)])/len(test_label)\n",
" precision = \\\n",
" sum([x == y for x, y in zip(pred_label, test_label) if x == \"A\"])/sum([x == \"A\" for x in pred_label])\n",
" recall = \\\n",
" sum([x == y for x, y in zip(pred_label, test_label) if y == \"A\"])/sum([y == \"A\" for y in test_label])\n",
" specificity = \\\n",
" sum([x == y for x, y in zip(pred_label, test_label) if y == \"B\"])/sum([y == \"B\" for y in test_label])\n",
" f1 = 2*recall*precision/(recall + precision)\n",
" eval_dict = {\"accuracy\": accuracy, \"precision\": precision, \"recall\": recall, \"specificity\": specificity, \"F1-measure\":f1}\n",
" if print_mode:\n",
" print(\"result: \", pred_label)\n",
" print(\"truth : \", test_label)\n",
" print(eval_dict)\n",
" else:\n",
" return eval_dict\n",
"\n",
"\n",
"# サンプル取得(ad_hoc_dataを使用)\n",
"aqua_globals. random_seed = seed\n",
"sample_Total, training_input_unnormalized, test_input_unnormalized, class_labels = ad_hoc_data(\n",
" training_size=training_dataset_size, \n",
" test_size=testing_dataset_size, \n",
" n=feature_dim, gap=0.3, plot_data=False\n",
")\n",
"\n",
"# 規格化\n",
"(train_for_pred, _), _ = split_dataset_to_data_and_labels(training_input_unnormalized)\n",
"(test_for_pred, _), _ = split_dataset_to_data_and_labels(test_input_unnormalized)\n",
"dataset_array = np.vstack([train_for_pred, test_for_pred])\n",
"min_array, max_array = dataset_array.min(), dataset_array.max()\n",
"training_input_normalized = {k: (v-min_array)/(max_array-min_array)*2-1 for k, v in training_input_unnormalized.items()}\n",
"test_input_normalized = {k: (v-min_array)/(max_array-min_array)*2-1 for k, v in test_input_unnormalized.items()}\n",
"\n",
"# 計算実行\n",
"dict_result = {}\n",
"for depth in range(1, 11):\n",
" start_time = time.time()\n",
" backend = BasicAer.get_backend('qasm_simulator')\n",
" feature_map_depth = ZZFeatureMap(feature_dim, reps=depth)\n",
" svm_depth = QSVM(feature_map_depth, training_input_normalized, test_input_normalized, test_for_pred)\n",
" svm_depth.random_seed = seed\n",
" quantum_instance = QuantumInstance(backend, shots=shots, seed_simulator=seed, seed_transpiler=seed)\n",
" result_depth = svm_depth.run(quantum_instance)\n",
" eval_metrics_dict = eval_model(result_depth[\"predicted_classes\"], print_mode=False)\n",
" print(\"depth: \", depth)\n",
" eval_metrics_dict_print = {k: round(v, 2) for k, v in eval_metrics_dict.items()}\n",
" print(eval_metrics_dict_print)\n",
" print(\"--- %s seconds ---\" % (round(time.time() - start_time)))\n",
" dict_result[depth] = {\"evaluation\": eval_metrics_dict,\n",
" \"time\": time.time() - start_time,\n",
" \"result\": result_depth}\n",
" \n",
"dir = os.path.dirname(os.path.abspath(__file__))\n",
"with open(dir+\"/../output/depth_variator_output.pkl\", \"wb\") as f:\n",
" pickle.dump(dict_result, f)\n",
"\n",
"'''\n",
"\n",
"with open(\"qsvm_terminal/script/depth_variator.py\", \"w\") as f:\n",
" f.write(code_string_depth)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"depth: 1\n",
"{'accuracy': 0.6, 'precision': 0.62, 'recall': 0.5, 'specificity': 0.7, 'F1-measure': 0.56}\n",
"--- 244 seconds ---\n",
"depth: 2\n",
"{'accuracy': 0.5, 'precision': 0.5, 'recall': 0.5, 'specificity': 0.5, 'F1-measure': 0.5}\n",
"--- 238 seconds ---\n",
"depth: 3\n",
"{'accuracy': 0.5, 'precision': 0.5, 'recall': 0.2, 'specificity': 0.8, 'F1-measure': 0.29}\n",
"--- 242 seconds ---\n",
"depth: 4\n",
"{'accuracy': 0.7, 'precision': 0.67, 'recall': 0.8, 'specificity': 0.6, 'F1-measure': 0.73}\n",
"--- 140 seconds ---\n",
"depth: 5\n",
"{'accuracy': 0.55, 'precision': 0.56, 'recall': 0.5, 'specificity': 0.6, 'F1-measure': 0.53}\n",
"--- 250 seconds ---\n",
"depth: 6\n",
"{'accuracy': 0.45, 'precision': 0.43, 'recall': 0.3, 'specificity': 0.6, 'F1-measure': 0.35}\n",
"--- 268 seconds ---\n",
"depth: 7\n",
"{'accuracy': 0.6, 'precision': 0.62, 'recall': 0.5, 'specificity': 0.7, 'F1-measure': 0.56}\n",
"--- 270 seconds ---\n",
"depth: 8\n",
"{'accuracy': 0.45, 'precision': 0.45, 'recall': 0.5, 'specificity': 0.4, 'F1-measure': 0.48}\n",
"--- 279 seconds ---\n",
"depth: 9\n",
"{'accuracy': 0.5, 'precision': 0.5, 'recall': 0.7, 'specificity': 0.3, 'F1-measure': 0.58}\n",
"--- 284 seconds ---\n",
"depth: 10\n",
"{'accuracy': 0.55, 'precision': 0.54, 'recall': 0.7, 'specificity': 0.4, 'F1-measure': 0.61}\n",
"--- 290 seconds ---\n"
]
}
],
"source": [
"cmd = [\"python\", \"qsvm_terminal/script/depth_variator.py\"]\n",
"\n",
"proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)\n",
"\n",
"\n",
"for line in iter(proc.stdout.readline,b''):\n",
" print(line.rstrip().decode(\"utf8\"))\n"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>accuracy</th>\n",
" <th>precision</th>\n",
" <th>recall</th>\n",
" <th>specificity</th>\n",
" <th>F1-measure</th>\n",
" <th>time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <td>1</td>\n",
" <td>0.60</td>\n",
" <td>0.625000</td>\n",
" <td>0.5</td>\n",
" <td>0.7</td>\n",
" <td>0.555556</td>\n",
" <td>248.298147</td>\n",
" </tr>\n",
" <tr>\n",
" <td>2</td>\n",
" <td>0.50</td>\n",
" <td>0.500000</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.500000</td>\n",
" <td>238.146821</td>\n",
" </tr>\n",
" <tr>\n",
" <td>3</td>\n",
" <td>0.50</td>\n",
" <td>0.500000</td>\n",
" <td>0.2</td>\n",
" <td>0.8</td>\n",
" <td>0.285714</td>\n",
" <td>238.769541</td>\n",
" </tr>\n",
" <tr>\n",
" <td>4</td>\n",
" <td>0.70</td>\n",
" <td>0.666667</td>\n",
" <td>0.8</td>\n",
" <td>0.6</td>\n",
" <td>0.727273</td>\n",
" <td>146.780808</td>\n",
" </tr>\n",
" <tr>\n",
" <td>5</td>\n",
" <td>0.55</td>\n",
" <td>0.555556</td>\n",
" <td>0.5</td>\n",
" <td>0.6</td>\n",
" <td>0.526316</td>\n",
" <td>246.763014</td>\n",
" </tr>\n",
" <tr>\n",
" <td>6</td>\n",
" <td>0.45</td>\n",
" <td>0.428571</td>\n",
" <td>0.3</td>\n",
" <td>0.6</td>\n",
" <td>0.352941</td>\n",
" <td>260.120211</td>\n",
" </tr>\n",
" <tr>\n",
" <td>7</td>\n",
" <td>0.60</td>\n",
" <td>0.625000</td>\n",
" <td>0.5</td>\n",
" <td>0.7</td>\n",
" <td>0.555556</td>\n",
" <td>292.442170</td>\n",
" </tr>\n",
" <tr>\n",
" <td>8</td>\n",
" <td>0.45</td>\n",
" <td>0.454545</td>\n",
" <td>0.5</td>\n",
" <td>0.4</td>\n",
" <td>0.476190</td>\n",
" <td>273.795143</td>\n",
" </tr>\n",
" <tr>\n",
" <td>9</td>\n",
" <td>0.50</td>\n",
" <td>0.500000</td>\n",
" <td>0.7</td>\n",
" <td>0.3</td>\n",
" <td>0.583333</td>\n",
" <td>282.874764</td>\n",
" </tr>\n",
" <tr>\n",
" <td>10</td>\n",
" <td>0.55</td>\n",
" <td>0.538462</td>\n",
" <td>0.7</td>\n",
" <td>0.4</td>\n",
" <td>0.608696</td>\n",
" <td>286.375107</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" accuracy precision recall specificity F1-measure time\n",
"1 0.60 0.625000 0.5 0.7 0.555556 248.298147\n",
"2 0.50 0.500000 0.5 0.5 0.500000 238.146821\n",
"3 0.50 0.500000 0.2 0.8 0.285714 238.769541\n",
"4 0.70 0.666667 0.8 0.6 0.727273 146.780808\n",
"5 0.55 0.555556 0.5 0.6 0.526316 246.763014\n",
"6 0.45 0.428571 0.3 0.6 0.352941 260.120211\n",
"7 0.60 0.625000 0.5 0.7 0.555556 292.442170\n",
"8 0.45 0.454545 0.5 0.4 0.476190 273.795143\n",
"9 0.50 0.500000 0.7 0.3 0.583333 282.874764\n",
"10 0.55 0.538462 0.7 0.4 0.608696 286.375107"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with open(\"qsvm_terminal/output/depth_variator_output.pkl\", \"rb\") as f:\n",
" result_dict = pickle.load(f)\n",
"\n",
"records = [{**value[\"evaluation\"], **{\"time\": value[\"time\"]}} for value in result_dict.values()]\n",
"df = pd.DataFrame(records,index=range(1,11))\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,6))\n",
"for col in df.columns:\n",
" if col == \"time\": continue\n",
" plt.plot(df[col],linestyle='-', marker='o',label=col)\n",
"\n",
"plt.axis('auto')\n",
"plt.ylim(0,1) \n",
"plt.xticks(range(1,11))\n",
"plt.rcParams[\"legend.edgecolor\"] = 'black'\n",
"plt.ylabel(\"Model Performance Metrics\",fontsize=18)\n",
"plt.xlabel(\"Circuit Depth\",fontsize=18)\n",
"plt.legend(bbox_to_anchor=(1, 0), loc='lower right', borderaxespad=0, fontsize=11)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAF/CAYAAAD0P5WNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeXgV9dn/8fedhBDCEgiELew7CgWUIhX3fWtRq1ZbW+3PFlu1j61Vq12e2sW6tfp0tVJt1apV3Km7FfeKiuyIyCqrkMgWIECW+/fHTOAQkpAD52Qmyed1Xec6c2bmzLmPtMkn893M3RERERGR+MqIugARERERqZsCm4iIiEjMKbCJiIiIxJwCm4iIiEjMKbCJiIiIxJwCm4iIiEjMRR7YzCzTzGaY2TPh675m9q6ZLTSzR8wsO9zfMny9KDzeJ8q6RURERBpK5IENuBKYn/D6FuAOdx8IbAAuCfdfAmxw9wHAHeF5IiIiIk1epIHNzHoApwN3h68NOA54LDzlPuDMcHt8+Jrw+PHh+SIiIiJNWtR32P4PuBaoDF93BDa6e3n4eiVQGG4XAisAwuObwvNFREREmrSsqD7YzM4A1rn7B2Z2TNXuGk71ehxLvO4EYAJA69atDx0yZEgKqhURERFJrw8++KDY3QtqOhZZYAPGAV8ys9OAHKAdwR239maWFd5F6wGsDs9fCfQEVppZFpAHrK9+UXefCEwEGD16tE+bNi3tX0RERETkQJnZJ7Udi6xJ1N2vd/ce7t4HOB+Y4u5fA14FzglPuwh4OtyeHL4mPD7FtXK9iIiINANR92GryY+Aq8xsEUEftXvC/fcAHcP9VwHXRVSfiIiISIOKskl0F3d/DXgt3F4CjKnhnO3AuQ1amIiIiEgMxPEOm4iIiIgkUGATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERiTkFNhEREZGYU2ATERERibnIApuZ5ZjZe2Y2y8zmmdkvwv33mtlSM5sZPkaG+83M/mBmi8xstpkdElXtIiIiIg0pK8LP3gEc5+5bzKwF8JaZPR8eu8bdH6t2/qnAwPBxGHBn+CwiIiLSpEV2h80DW8KXLcKH1/GW8cD94fumAu3NrFu66xQRERGJWqR92Mws08xmAuuAl9393fDQjWGz5x1m1jLcVwisSHj7ynBf9WtOMLNpZjatqKgorfWLiIiINIRIA5u7V7j7SKAHMMbMhgHXA0OAzwP5wI/C062mS9RwzYnuPtrdRxcUFKSpchEREZGGE4tRou6+EXgNOMXd14TNnjuAfwBjwtNWAj0T3tYDWN2ghYqIiIhEIMpRogVm1j7cbgWcAHxU1S/NzAw4E5gbvmUy8I1wtOhYYJO7r4mgdBEREZEGFeUo0W7AfWaWSRAcJ7n7M2Y2xcwKCJpAZwLfCc9/DjgNWARsA74ZQc0iIiIiDS6ywObus4FRNew/rpbzHbg83XWJiIiIxE0s+rCJiIiISO0U2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiLrLAZmY5Zvaemc0ys3lm9otwf18ze9fMFprZI2aWHe5vGb5eFB7vE1XtIiIiIg0pyjtsO4Dj3H0EMBI4xczGArcAd7j7QGADcEl4/iXABncfANwRniciIiLS5EUW2DywJXzZInw4cBzwWLj/PuDMcHt8+Jrw+PFmZg1UroiIiEhkIu3DZmaZZjYTWAe8DCwGNrp7eXjKSqAw3C4EVgCExzcBHWu45gQzm2Zm04qKitL9FURERETSLtLA5u4V7j4S6AGMAYbWdFr4XNPdNN9rh/tEdx/t7qMLCgpSV6yIiIhIRGIxStTdNwKvAWOB9maWFR7qAawOt1cCPQHC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slsygW0N0APA3bcCG4FhCcd7ABp0ICIiIpJiySwj9T4wLuH1S8APzOwTguB3BcFgBBERERFJoWTusN0DFJtZq/D1j4FS4F7g7wTNpNemtDoRERERqf8dNnd/GXg54fUSMxsEHA9UAG+5+6bUlygiIiLSvCXTJLqXsC/b5BTVIiIiIiI1qLNJ1MwyzexmM/vOPs77rpn9xswsteWJiIiIyL76sF0IXEMw4KAu7wE/Ai5IRVEiIiIistu+Att5wH/c/YO6TgqPv4gCm4iIiEjK7SuwHQr8p57XehUYfWDliIiIiEh1+wps+cC6el6rKDxfRERERFJoX4GtBOhUz2t1BLYcWDkiIiIiUt2+Ats84KR6XuvE8HwRERERSaF9BbYngBPMbHxdJ5nZlwgC2+OpKkxEREREAvsKbHcBi4BJZnajmfVJPGhmfczs18Ak4OPwfBERERFJoTpXOnD3UjM7HXgGuB64zsxKgM1AW6AdYMAC4Ax3357mekVERESanX0u/u7ui4CRwJXAW0A50JVg/dA3w/2HuPviZD7YzP5uZuvMbG7Cvnwze9nMFobPHcL9ZmZ/MLNFZjbbzA5J5rNEREREGrN9BjYAd9/u7n9096PdvZO7Z4fPx4T7S/fjs+8FTqm27zrgFXcfCLwSvgY4FRgYPiYAd+7H54mIiIg0SvUKbOng7m8A66vtHg/cF27fB5yZsP9+D0wF2ptZt4apVERERCRakQW2WnRx9zUA4XPncH8hsCLhvJXhvr2Y2QQzm2Zm04qKitJarIiIiEhDiFtgq43VsM9rOtHdJ7r7aHcfXVBQkOayRERERNIvboFtbVVTZ/hctSzWSqBnwnk9gNUNXJuIiIhIJOIW2CYDF4XbFwFPJ+z/RjhadCywqarpVERERKSpq3MetnQys38BxwCdzGwl8HPgZoJJei8BlgPnhqc/B5xGMInvNuCbDV6wiIiISEQiC2zufkEth46v4VwHLk9vRSIiIiLxFLcmURERERGpRoFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOYU2ERERERiToFNREREJOayoi6gJma2DCgBKoBydx9tZvnAI0AfYBlwnrtviKpGERERkYYS5ztsx7r7SHcfHb6+DnjF3QcCr4SvRURERJq8OAe26sYD94Xb9wFnRliLiIiISIOJa2Bz4CUz+8DMJoT7urj7GoDwuXNNbzSzCWY2zcymFRUVNVC5IiIiIukTyz5swDh3X21mnYGXzeyj+r7R3ScCEwFGjx7t6SpQREREpKHE8g6bu68On9cBTwJjgLVm1g0gfF4XXYUiIiIiDSd2gc3MWptZ26pt4CRgLjAZuCg87SLg6WgqFBEREWlYcWwS7QI8aWYQ1PeQu79gZu8Dk8zsEmA5cG6ENYqIiIg0mNgFNndfAoyoYf9nwPENX5GIiIhItGLXJCoiIiIie1JgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmFNgExEREYk5BTYRERGRmGt0gc3MTjGzBWa2yMyui7oeERERkXRrVIHNzDKBPwOnAgcBF5jZQdFWJSIiIpJejSqwAWOARe6+xN13Ag8D4yOuSURERCStGltgKwRWJLxeGe4TERERabKyoi4gSVbDPt/jBLMJwITw5RYzW5D2qqATUNwAnxMVfb/Gr6l/R32/xq+pf0d9v8avIb5j79oONLbAthLomfC6B7A68QR3nwhMbMiizGyau49uyM9sSPp+jV9T/476fo1fU/+O+n6NX9TfsbE1ib4PDDSzvmaWDZwPTI64JhEREZG0alR32Ny93MyuAF4EMoG/u/u8iMsSERERSatGFdgA3P054Lmo66imQZtgI6Dv1/g19e+o79f4NfXvqO/X+EX6Hc3d932WiIiIiESmsfVhExER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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(10,6))\n",
"plt.plot(df[\"time\"],linestyle='-', marker='o')\n",
"plt.xticks(range(1,11))\n",
"plt.ylabel(\"Calclulation Time\",fontsize=18)\n",
"plt.xlabel(\"Circuit Depth\",fontsize=18)\n",
"plt.ylim(0,400)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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.7.4"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "741.1764526367188px",
"left": "26px",
"top": "156.4779510498047px",
"width": "338.8125px"
},
"toc_section_display": true,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment