diff --git a/pattern_finder.py b/pattern_finder.py new file mode 100644 index 00000000..5d4ef31d --- /dev/null +++ b/pattern_finder.py @@ -0,0 +1,101 @@ +import argparse +import csv +import json +import re +from collections import namedtuple +from pathlib import Path +from typing import Tuple + + +def parse_arguments(): + parser = argparse.ArgumentParser() + parser.add_argument("-m", "--model_name", type=str, default=None) + parser.add_argument('-t', '--task_name', type=str, default=None) + return parser.parse_args() + + +def save_results(folder_name: str, task_name: str, results: dict) -> None: + + folder = Path(__file__).parent / folder_name + if not folder.exists(): + folder.mkdir() + + fieldnames = ['answer', 'certainty', 'score', 'count', 'prompt', 'prompt_number'] + with open(folder / f'{task_name}.csv', 'w') as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + for k, v in sorted(results.items(), key=lambda x: -x[1]): + writer.writerow({'answer': k.answer, + 'certainty': k.certainty, + 'score': k.score, + 'prompt': k.prompt, + 'prompt_number': k.prompt_number, + 'count': v}) + + +def load_json(path: Path) -> dict: + with open(path) as f: + data = json.load(f) + return data + + +def replace_with_metadata(metadata: dict, + prompt: str, + prediction_string: str) -> Tuple[str, str]: + for k, v in metadata.items(): + if k not in {'answer', 'distractor', 'query'}: + continue + if isinstance(v, str) or isinstance(v, int): + prediction_string = re.sub(fr'\b({v})\b'.lower(), fr'{k}', prediction_string) + prompt = re.sub(fr'\b({v})\b'.lower(), fr'{k}', prompt) + if isinstance(v, list): + for i in v: + prediction_string = re.sub(fr'\b({i})\b'.lower(), fr'{k}', prediction_string) + prompt = re.sub(fr'\b({i})\b'.lower(), fr'{k}', prompt) + prompt = prompt.replace('a:', '').strip() + return prompt, prediction_string + + +def process_predictions(data: dict, predictions: dict) -> Tuple[dict, dict]: + + Answer = namedtuple('Answer', + ['answer', 'certainty', 'score', 'prompt', 'prompt_number']) + positive, negative = {}, {} + + for prompt_number, (example, prediction) in enumerate(zip(data['examples'].values(), + predictions.values())): + prediction_string = prediction['prediction'].lower() + prompt = prediction['input'].lower() + prediction_certainty = prediction['certainty'] + prediction_score = prediction['score'] + metadata = example['metadata'] + prompt, prediction_string = replace_with_metadata(metadata, prompt, prediction_string) + ans = prediction_string.split('\n', 1)[1] + ans = ans.replace('a: ', '').strip() + prompt_number = prompt_number // data['settings']['num_examples_per_template'] + 1 + answer = Answer(ans, prediction_certainty, prediction_score, prompt, prompt_number) + if answer.score == 0: + negative[answer] = negative.get(answer, 0) + 1 + else: + positive[answer] = positive.get(answer, 0) + 1 + + return positive, negative + + +def main(): + args = parse_arguments() + model, task = args.model_name, args.task_name + + predictions_path = Path(__file__).parent / 'predictions' / task / f'{model}.json' + data_path = Path(__file__).parent / 'data' / f'{task}.json' + + predictions_json = load_json(predictions_path) + data_json = load_json(data_path) + + positive, negative = process_predictions(data_json, predictions_json) + save_results('positive_patterns', task, positive) + save_results('negative_patterns', task, negative) + + +if __name__ == '__main__': + main() diff --git a/statistics_viz.ipynb b/statistics_viz.ipynb new file mode 100644 index 00000000..3340f844 --- /dev/null +++ b/statistics_viz.ipynb @@ -0,0 +1,241 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2024-01-06T20:24:19.571506757Z", + "start_time": "2024-01-06T20:24:19.490337322Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "outputs": [ + { + "data": { + "text/plain": " task_name template_1 template_2 template_3\n0 smaller_number 55.3 58.6 48.4\n1 less_letters 46.3 52.5 24.1\n2 homophones 40.0 36.2 59.5\n3 first_alphabetically 57.8 56.3 56.5\n4 rhyming_word 0.6 47.8 47.6\n5 bigger_number 96.2 92.0 28.0", + "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
task_nametemplate_1template_2template_3
0smaller_number55.358.648.4
1less_letters46.352.524.1
2homophones40.036.259.5
3first_alphabetically57.856.356.5
4rhyming_word0.647.847.6
5bigger_number96.292.028.0
\n
" + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('results/accuracy_per_template.csv', \n", + " skiprows=2,\n", + " names=['task_name', 'template_1', 'template_2', 'template_3']\n", + " )\n", + "df" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:33:10.530542715Z", + "start_time": "2024-01-06T20:33:10.516851160Z" + } + }, + "id": "3609df1f9a17d52" + }, + { + "cell_type": "code", + "execution_count": 16, + "outputs": [], + "source": [ + "import os\n", + "import json\n", + "from pathlib import Path\n", + "\n", + "\n", + "def get_number_of_prompts(task):\n", + " predictions_path = Path(os.getcwd()) / 'predictions' / task / 'vicuna-7b-v1-3.json'\n", + " with open(predictions_path) as f:\n", + " preds = json.load(f)\n", + " return len(preds) - 1" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:33:10.783871368Z", + "start_time": "2024-01-06T20:33:10.777435683Z" + } + }, + "id": "e448a44a929fedbd" + }, + { + "cell_type": "code", + "execution_count": 17, + "outputs": [ + { + "data": { + "text/plain": " task_name template_1 template_2 template_3 prompts_per_templ\n0 smaller_number 0.553 0.586 0.484 1000.0\n1 less_letters 0.463 0.525 0.241 1000.0\n2 homophones 0.400 0.362 0.595 800.0\n3 first_alphabetically 0.578 0.563 0.565 1000.0\n4 rhyming_word 0.006 0.478 0.476 1000.0\n5 bigger_number 0.962 0.920 0.280 1000.0", + "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
task_nametemplate_1template_2template_3prompts_per_templ
0smaller_number0.5530.5860.4841000.0
1less_letters0.4630.5250.2411000.0
2homophones0.4000.3620.595800.0
3first_alphabetically0.5780.5630.5651000.0
4rhyming_word0.0060.4780.4761000.0
5bigger_number0.9620.9200.2801000.0
\n
" + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['prompts_per_templ'] = df.task_name.apply(get_number_of_prompts) / 3\n", + "\n", + "for templ in range(3):\n", + " df[f'template_{templ + 1}'] = df[f'template_{templ + 1}'] / 100\n", + " \n", + "df" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:33:11.517632779Z", + "start_time": "2024-01-06T20:33:11.458273063Z" + } + }, + "id": "5a1e4a60789ea85" + }, + { + "cell_type": "code", + "execution_count": 18, + "outputs": [], + "source": [ + "for templ_number in range(1, 4):\n", + " df[f'template_{templ_number}_std'] = (\n", + " (df[f'template_{templ_number}']) * (1 - df[f'template_{templ_number}']) / df.prompts_per_templ\n", + " ) ** 0.5" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:33:12.505559805Z", + "start_time": "2024-01-06T20:33:12.500620298Z" + } + }, + "id": "da40fe6bcafe048" + }, + { + "cell_type": "code", + "execution_count": 19, + "outputs": [ + { + "data": { + "text/plain": " task_name template_1 template_2 template_3 \\\n0 smaller_number 0.553 0.586 0.484 \n1 less_letters 0.463 0.525 0.241 \n2 homophones 0.400 0.362 0.595 \n3 first_alphabetically 0.578 0.563 0.565 \n4 rhyming_word 0.006 0.478 0.476 \n5 bigger_number 0.962 0.920 0.280 \n\n prompts_per_templ template_1_std template_2_std template_3_std \n0 1000.0 0.015722 0.015576 0.015803 \n1 1000.0 0.015768 0.015792 0.013525 \n2 800.0 0.017321 0.016991 0.017356 \n3 1000.0 0.015618 0.015685 0.015677 \n4 1000.0 0.002442 0.015796 0.015793 \n5 1000.0 0.006046 0.008579 0.014199 ", + "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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n
task_nametemplate_1template_2template_3prompts_per_templtemplate_1_stdtemplate_2_stdtemplate_3_std
0smaller_number0.5530.5860.4841000.00.0157220.0155760.015803
1less_letters0.4630.5250.2411000.00.0157680.0157920.013525
2homophones0.4000.3620.595800.00.0173210.0169910.017356
3first_alphabetically0.5780.5630.5651000.00.0156180.0156850.015677
4rhyming_word0.0060.4780.4761000.00.0024420.0157960.015793
5bigger_number0.9620.9200.2801000.00.0060460.0085790.014199
\n
" + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:33:13.472000233Z", + "start_time": "2024-01-06T20:33:13.444169480Z" + } + }, + "id": "82f4ad2998ec8c7c" + }, + { + "cell_type": "code", + "execution_count": 46, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABIoAAAKDCAYAAAB1zuEHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACIDElEQVR4nOzdeXhMZ//H8c8kxBZLJMS+tomdFFFbFVWtnZanC9rSUtWdok/R0gUtrepKaSzVxRZF1UO1tlpqSWmVaq1BkA3ZCMn5/WFyfhmTZTJJTIz367pclzlz5pzvnNxzZuYz930fi2EYhgAAAAAAAHDL83B1AQAAAAAAACgYCIoAAAAAAAAgiaAIAAAAAAAAVgRFAAAAAAAAkERQBAAAAAAAACuCIgAAAAAAAEgiKAIAAAAAAIAVQREAAAAAAAAkERQBAAAAAADAiqAIAADgJrVjxw4FBgYqMDBQHTp0cHU5boVje3Pr0KGD+ffbsWOHq8sBgJtKIVcXAADuZMeOHRo4cKB5u1ixYtqyZYu8vb1dWBUAAAAAOIYeRQCQh5YvX25zOykpSWvWrHFNMQBs0EMErkYvF/d38uRJ828cGBjo6nIAwCkERQCQRxITEzMMha4PjwAAAACgoCIoAoA8snbtWiUmJkqS7rjjDpUoUUKStGvXLoWHh7uyNAAAAABwCEERAOSR0NBQ8/99+/bVvffeK0kyDEPff/+9q8oCAAAAAIcRFAFAHjh9+rQ530TRokV17733qkePHub9y5cvl2EYrioPAAAAABzCVc8AIA98//33ZhDUoUMHeXt7684775S/v7/Onj2r8PBw7d69W82aNcvxtnft2qW1a9dq586dOnv2rC5evKjChQurYsWKqlu3rtq0aaNOnTo5dGW1AwcO6Mcff9S2bdsUERGh8+fPq3DhwipXrpwCAwPVsmVL3XfffSpbtqzdY8eMGWP2mnr22Wf13HPPZbu/Dh066NSpU5Kk+fPnq0WLFnbrfPTRR/r4448lSb1799bkyZMlSdu2bdP333+v33//XZGRkYqPj7e5P010dLQ2bdqkHTt26O+//9apU6eUkJCgYsWKydfXVw0bNlTHjh3VuXNneXjk7PcRwzC0adMmrV+/XmFhYYqMjFRcXJyKFSumypUrq169errrrrvUsWNHeXl5mY8bMWKEVq1aJUm6//77NX36dIf32blzZx07dkySNHLkSD311FM5qjnNyZMn1bFjR/P233//LUkKDw/Xd999p40bN+rMmTO6evWqKlasqLZt2+rhhx9WjRo1crSf5ORk/fjjj/rll1/0119/KSoqSikpKfL19VXjxo3VuXNnde7cWRaLJcvtZNS+UlNT9fPPP2vFihU6ePCgIiMjlZiY6HD7S5O+jaU5depUphPNTpo0SX369LFZlpqaqj179mjr1q3au3evjhw5otjYWF29elVlypRRtWrVFBwcrH79+qlSpUoO1/bvv/9q6dKl2r17t44fP66EhAR5eHjI29tblSpVUmBgoJo2baoOHTqoTJkyDm83M8uXL9drr72mq1evSpL69Omjt956S56enk5vM69fgxmdN5KTk7Vy5Up9//33Onr0qGJjY1WmTBk1bNhQvXv3NntwOmrnzp1atGiRdu/ercjISJUqVUpVq1bVfffdpz59+qhUqVJOHYuMXP9aTJP+CpnpBQcHa8GCBZluLyYmRitWrNCmTZt09OhRRUdHy8vLS+XLl1eLFi3Us2dPNWnSJNu6MjrO8fHxCg0N1Q8//KDw8HBduHBB5cqVU6tWrTRkyBBVr17dZhupqalas2aNQkNDtX//fl28eFGlS5dWo0aN1L9/f7Vu3TrLGm7UeSo7hw8f1ubNm7V79279888/OnfunC5fvixvb29VqFBBTZs2Vffu3RUUFJTpNpYtW6ZXX33Vbnlm55nszmP//vuvVq1apV9//dV8vy5ZsqQqV66sNm3a5PhcAwA5QVAEAHkg/YTV3bt3lyR5eHioa9eu+vLLLyVdG5qWk6DoxIkTGj9+vLZt22Z335UrV3T48GEdPnxYq1at0sSJE7VlyxZzXqTrxcTE6I033tDatWvtejZduXJFx48f1/Hjx7V27Vq98847WrFihWrVquVwrXkpPj5e48eP1w8//JDtum+//bYWLlyolJQUu/vi4uIUFxenY8eOaeXKlQoICNCMGTNUs2ZNh+r4888/NX78eO3fvz/DbR88eFAHDx7UsmXLVLlyZf3888/m/f/5z3/MoOinn35SbGysfHx8st3nrl27zJCocOHC6t27t0O1Our777/X+PHjdenSJZvlaW3pm2++0ahRo9S/f3+HtrdlyxZNmDBBJ06csLvv1KlTOnXqlFavXq0GDRpo+vTpqlq1qsO1RkVFaeTIkRm2/xvt8OHDeuKJJ3T27NkM74+MjFRkZKR2796t2bNn6+mnn9azzz6b5TYNw9B7772nkJAQpaam2t1/+fJlRUdH648//tCSJUtUu3ZtrV69OlfPY968eZo0aZJ5DnjiiSc0evTobEO8rOTnazDN8ePH9cILL+jAgQM2yyMjI/Xzzz/r559/VqdOnfT+++/bBLYZuXr1qiZOnKjvvvvOZnlUVJSioqIUFham+fPn66OPPspRjTfK3Llz9fHHHysuLs5m+eXLlxUXF6fDhw/r66+/Vvfu3fXWW2+paNGiDm/74MGDeu655+xez6dPn9aSJUu0atUqzZo1ywz8Y2Ji9Pzzz2vnzp0260dFRZl/l6efflovvfRSjp5jXp+nstOnT58Mz/OSdP78eZ0/f14HDx7UwoULde+992ry5MmZvtfmhcTERE2aNElLly61e13FxMQoJiZGf/zxh7788ks999xzTv+YAABZISgCgFzas2eP+eXex8dHbdu2Ne/r2bOnGRStWbNG48aNc+iD+969ezV06FDFxsaayzw8PFS7dm2VLVtWly9f1smTJxUVFSXp2gfLjL6oSde+ZA0ePNhuQu0aNWqofPnyunr1qiIiIhQRESHpWnB0+fJlxw9AHjIMQyNGjNCGDRskSaVLl1atWrVksVgyDCP++ecf83lbLBZVqVJFfn5+Klq0qC5evKgjR44oKSlJknTo0CE99NBDCg0NzfZX2F9++UUvvfSS+VjpWnBTu3ZtlSlTRklJSTp+/LjOnz8vSbp48aLN44ODg1WzZk0dPXpUV65c0ffff6/HH3882+e/ePFi8/933323/Pz8sn2Mo3755ReNGjVKkuTp6amAgACVLFlSJ0+e1OnTpyVd+7L55ptvKiUlRY899liW21u2bJnGjRtn9kyRpPLly6tq1ary8PDQsWPHFBkZKela6Pbwww9r4cKFdj0SMpKcnKwhQ4aYX978/PxUvXp1paSk6OjRozl+7tWqVVObNm104cIF/fHHH5KkIkWKqHnz5hmu7+/vb3M7NjbWJiQqUaKEqlevrpIlSyo1NVWnT582e2ZcuXJFH330kRISEjR69OhMa/rggw80Z84c87bFYlH16tVVvnx5eXh46OLFizp27Jg5QX5GYVJOfPjhh/r000/N2y+++KKGDRuWq21K+fcaTBMVFaVXXnnFPP41atSQv7+/4uLi9Pfff5v7XrdunSZPnqzx48dnui3DMDR69GgzxE1z2223qWzZsjp37pyOHTumU6dOadCgQfrvf/+b4+ORkaJFi6pNmzaSrvVkSju/NmzYUKVLl7ZbP6MeKKmpqXr99de1aNEic1n6NpOcnKxDhw6Z7WXlypU6deqU5s2bl214JkkRERF64YUXFBsbKw8PD91+++0qU6aMIiIizHPvpUuX9PTTT2v58uUqX768Bg0aZIZ3VapUUaVKlRQfH6+DBw+a7fXzzz/X7bffrm7dujl0rPL6POWIgwcPmv8vXLiwqlevLh8fH3l4eCgmJkZHjhwx29natWsVGRmpr776SoUK2X6N8vf3V5s2bXT58mWb8Cztb3+9atWq2S2LjY3VkCFDtG/fPpuabrvtNpUuXVoXLlzQP//8o6tXr+ry5cuaOnWqYmJisjzXAIAzCIoAIJfS9ya6//77VbhwYfN2nTp1FBAQoEOHDik+Pl7r1q0zexxlJjIyUs8884wZEhUpUkRDhgzRo48+atcr5fjx41q9erUWLlyY4baSkpL0zDPPmCGRh4eH+vfvryeffNLuy/DZs2e1Zs0affXVVw4/97y2bt06JSQkyNfXV2PHjtW9995rfhhPTU01v4ynKVSokO6//3517dpVLVu2tBt+l5ycrLVr12rKlCk6d+6czp8/r3Hjxtl8Qb/ev//+axMSlS5dWs8995x69+5tt/2DBw9q1apVGfb06Nevn6ZMmSJJWrp0abZBUXx8vP73v/+Zt/v27Zvl+jmVNiSiW7duGjNmjMqVK2fet2PHDr322mtmO3n33XfVokUL1alTJ8Nt7d69W2PHjjW/PLVt21Yvv/yy6tWrZ7Per7/+qtdff13h4eGKjIzUiBEj9O2339p9wbrewoULlZCQoGrVqun1119X69atzV4vV65cMQNSR/Xs2VM9e/bUjh07zOE+fn5+WbaD61WtWlV9+/ZVx44dVbt2bbteOCdOnNAnn3xing9CQkLUqVMn3XHHHXbbioyMNANk6Vpbef75523+JtK1YOPgwYNas2aNXa8NR6WmpurNN9/U119/LenaOWDcuHF65JFHnNre9fLjNZjexIkTdf78eXXo0EFjxoyxCRrPnDmjUaNGmfPDffPNNxo4cGCmw5LSesWkCQ4O1ptvvmmz/sGDB/Xf//5X+/fv16RJkxw8CllL39bSD/d65ZVXMhyOm5HZs2ebIZHFYtGAAQPszuPJyclaunSppkyZoqSkJO3Zs0dTp051KPCaNGmSzp8/r+7du2vUqFEqX768ed+2bdv03HPPKS4uTomJifr0009VokQJHThwQA0aNNCECRPUoEEDc/0TJ05o+PDhOnTokCRp6tSp6tKli0PDDvPyPOWokiVLqkePHurcubMaN25s8x4uSRcuXNDXX3+tTz/9VMnJyQoLC9OcOXM0dOhQm/Vat26t1q1b2w2nc7StG4ahUaNGmSGRt7e3XnrpJfXp00fFixc31zt//rw+/vhjc3jil19+qaZNm+qee+5x6vkDQIYMAIDTLl26ZDRr1swICAgwAgICjN27d9utM2vWLPP+QYMGZbvN559/3ly/cePGxm+//ZbtY5KSkoyrV6/aLZ8yZYq5rTp16hg//PBDttu6cuWKcenSJbvlo0ePNrc1Y8aMbLdjGIbRvn178zHbt2/PcJ0ZM2aY6wQEBBhBQUHGv//+69D2ExISHFovPDzc5u/0999/Z7ruAw88YK7XsmVL459//sl2+/Hx8XbLoqOjjQYNGpjb2rt3b5bb+Oabb8x177rrLiMlJSX7J5aF8PBwm+MaEBBgvPLKK5muHxERYbRu3dpcd+DAgRmud+XKFaNjx47meq+//rqRmpqa6XYjIyONu+66y1w/NDQ0w/XSt6+AgACjXbt2xrlz53L0nLOzfft2c/vt27d3+HFJSUkO/z3efvttcx/PPfdchuuEhoaa6zz88MMObTej17dhZP2ckpOTjZdfftm8v379+saqVasc2p+j8uM1mP68ERAQYLz88suZtrH4+HijTZs25rrTp0/PcL1Lly4ZLVq0MNd76KGHjMuXL2e4blxcnNGlSxebGnLSXrLiyDnxekeOHDHq169vBAQEGIGBgcbKlSuzXH/Hjh1GvXr1jICAAKNu3bpGeHh4trUEBAQYr732WqbbTN9m69ata9SpU8fo2bNnhuc+wzCMo0ePmjUEBAQY27Zty3C9/DpPXf/8sjrWjrbhdevWmdtr3bq1kZyc7NBzctSSJUvMxwQHB2f73vPpp5+a63fq1CnL8zAA5BRXPQOAXFi/fr057Khq1aoZ9h7o3r27+Uvq1q1bM53nRJI5T1Cal156KdPhMekVLVrUbjLauLg4ffvtt+btAQMGqEuXLtluq1ChQipSpEi26+WX4cOHq3bt2g6tm/5X1qxUqVLFZj6L9PMJpbdt2zZzaJJ0rTfDbbfdlu32M5qvomzZsjYT7KYfVpaR9Pf36dMnxxNvZ6dMmTIaO3ZspvdXqFBBI0eONG9v377dHFKZ3tq1a81f9GvWrKmxY8dmOceNn5+fzbCIb775xqF6r+9N4EpFixZ1+O/xwgsvmMNLN23aZDM0L036c0BG54yM5HSy6bTehGk9aIoWLapPPvlEXbt2zdF2spPXr8HrlSpVShMmTMi0jZUoUcKm992ePXsyXO9///uf2UvT09NTb731VqZDsry9vfXGG284VN+NMHfuXF25ckXStXNDdsO4goODzWOSkpJiNx9TRsqUKZNlz6MuXbqYvcVSUlKUmpqqCRMmZDpXT40aNXTnnXeatzP7u2RUR16cp3LC0TZ8zz33mPMMRkZG2rxX5JZhGDY9j1599dVs33uefvppc53jx49ry5YteVYPABAUAUAupF2lSVKmQ8oqVKig4OBgSdeGgXz//feZbm/16tXm3A4+Pj56+OGHna7tl19+UUJCgqRrcxwMGTLE6W3dKIUKFbK72lReady4sfn/zD7gp59AOzAwMNdd+fv162ez7bT5Q6538OBB/fnnn5KuDSt54IEHcrXfjPTo0SPbKzl17drV5spaP/30k9066dvvo48+mu0wMknq1KmTihUrJunasU9rl5kpW7bsTTuMokSJEuaXt6SkJP37779266QPYtOu8pSXLl68qEGDBmnTpk2Srg2tmTNnjtq1a5fn+8oJR16D10sfUGSmadOm5v+PHDmS4Trp23KLFi2yDaObN2+ugIAAh2rMT6mpqTbD5Rydkyf9+9H27duzXb9r165ZBiZeXl42Q7xuv/12m79nRho1amT+//Dhw9nWIOXdeSq/pH9OeRkU/fnnn+Yx8vX1zXaIunTtvSJ9aOjI3xkAHMUcRQDgpHPnzunXX381b/fo0SPTdXv06GF+iAsNDc00tNm1a5f5//bt2zs0CWlm0m8rKCgoTydGzi+1atVy6OpgGdm3b5/27Nmjw4cP68KFC0pKSrKZAPjChQvm/zPr1ZX+mOX0ctsZadGihWrUqKFjx44pISFBa9asyTAIW7Jkifn/Vq1aqUqVKrne9/XST7KemcKFC6tly5b68ccfJdl/ETIMw6ZnQPoeA9ltt0aNGjpw4IBSUlJ08OBBmy/312vcuLFDAZQrXLx4UVu2bNFff/2lM2fOKD4+3uztkSb9xPFnz561m0Olfv365v83bdqk999/X0899ZRKliyZ6/oiIyM1ePBgM4BKmx8nt/O4OCIvXoPXy+py5GnSz9Nz/dXA0qQFsVLmkwtf76677jLn2XGVgwcPKj4+XtK1Hw8yu9T69dKHXAcOHJBhGFn2/EsfgGQm/XtIdiHR9etn9ne5Xl6cp5x15coVbd++XX/88YdOnDih+Ph4Xbp0yeZKoekvquBoG3bE7t27zf83a9bM4R6Et99+u/n/v/76K8/qAYCC+SkMAG4CK1asMCfzbdCgQZaXfO7cubMmTpyoS5cu6ciRI9q3b1+GH8zT/xqe/sukM9JvK/1EowVZRleByc7GjRs1efLkTHsSZCSjLy2pqak2Qxhye/zT/Oc//zEntV68eLFdUJScnKyVK1eatx988ME82e/1HO0dkX64w/Hjx23uO3PmjM0V3t5++22Hv9CkXbFIks3V/DLiTDvIbxcuXNC0adMUGhqq5ORkhx+XUVtr1qyZ6tevb17VbebMmZo7d65atmypO++8U02bNlX9+vVzPNwsISFBjzzyiPlltnLlygoJCXHoSnO5kVevwYw4EnCnv5Jk+isVprly5YrNRPjpv1xnxdH18lP6oCo5OVmDBw/O8TauXLmi+Pj4LINIR45zWq9A6Vqvl5ysn9HfJSN5cZ7KqZSUFM2fP18zZ87M9tyUXlqAlxfS/53//PNPh//O6cPXnNQOANkhKAIAJ6W/2llWvYmka3NedOjQwbw6VmhoaIZBUdrl1qVrw29yI/0HSGd76dxomc13kZk5c+bo3XffzfF+ru8BIl07Xul/Oc7t8U/Tq1cvffDBB0pOTtaePXt05MgR1apVy7x/3bp15t/dx8cn34ZcpR+qkZX0bSV9KCTZtk/p2pxOzsjuC1ZO20F+O3funAYMGODUXCgZhUoWi0UzZszQkCFDzOEmly9f1oYNG7RhwwZJ184ZrVu3Vp8+fXT33Xc7tK/z58/b/I2ef/75fA+J8vI1mJHrr0DljOtDKUdfC46ul5/S/z0TEhKcnocmLi4uy6Aop8c5L/4uGcmL81ROXL16VS+88IJTw9dyEhhnJ/3f+dSpU3ZX+HSEo+ErADiCoAgAnPDnn3/qn3/+MW9Pnz5dH330UZaPSf+hcvXq1Xr11Vfthpal//KUm2Fn1+8vt9u6UXIygfPvv/9u8wW1cuXK6tevn5o1a6YqVaqodOnSKlKkiLnN9JdGz8j1H/rz6piVLVtWnTp1Muc/Wrx4sc3kzuknse7Zs2e+/a0c/WKXfv/XH5PM5ljKqfTDkTKS1xN559Z///tfMyTy8PBQ586d1alTJwUEBMjf319Fixa1OW4DBgzQb7/9luU2q1SpouXLl+u7777T4sWL7eYqio+P1//+9z/973//U5MmTTR16lRVrVo1y236+vqqQoUKZk+l119/Xf7+/mrZsqUTzzp7ef0azC/Xh1KOvsYKwnnT0Z442cnuNVdQ5MV5Kie+/PJLm5AoKChIPXv2VMOGDVWpUiWVKFHCZk6xjz76SB9//LHT+8tMXvyd0//QAQC5RVAEAE5IP4m1lPMv0OfPn9cvv/yizp072ywvWbKkYmJiJOX+18H0vx7nZRf5nEgbmpcfZs2aZf6/SZMm+vLLL7PsiZLdBMrXT6Cal7/O9uvXzwyKvv/+e7388ssqXLiwwsPDbSYgTX/1pryWkJCQ7SSxaeuluX4S4et7JGzbti3Pel4VVAcOHNDmzZvN2x988IHuu+++LB+TXVtL4+XlpQEDBmjAgAE6e/asduzYoZ07d2r79u02c6H8/vvveuyxxxQaGqrSpUtnur2iRYsqJCREjz/+uP766y9dunRJw4YN06xZs8wJ9fNSXr8G88v1NTl6PnRVvemlf83dfvvtNhNbu6O8OE85KiUlxeZKY/3799e4ceMc3m9eSv93fvTRRzV+/Ph82Q8AOKpg/WQHADeB5OTkPPmwfn3YJNnOE5HbS/7m5bYk2196M7rkd0ZyMyQgK4Zh2Ax7GjFiRLbDlbKbeLRYsWI228jtvBfp3XnnnapRo4YkKTo62hxetGzZMvNX4KCgoGwvh5wbJ0+ezPF6189Dcv08JmmhpjtLP2F9cHBwtiGR5Nwkt/7+/urRo4fefPNNrVu3TsuXL7eZUP3UqVP66quvst1O6dKlFRISYk5enZSUpKFDh9pM1J4X8uM1mF+8vb1t5jFydFiPo6+Z/JT+NRgdHe3CSm6MvDhPOWr//v3mkK9ixYpp5MiR2T4mv9rwrfZ3BlDwERQBQA5t3LjR/HDp5eWl3bt36++//3bo3zfffGNuZ/PmzXYfCJs0aWL+P7df7NJva/fu3bnulp7+S2D6+Y8yc+rUqTwbqnS98+fP22zbkcm6f//992zXSX/Mdu7c6UxpmerXr5/5/8WLFys1NVXLli0zl+XXJNZp9u3bl+P16tWrZ3Nf2bJlbYY/OXJMC5L0Q9ocfT1ERESY/3eknYWHhysqKirnxV2nbt26mjFjhlq0aGEuSx9aZaVMmTKaO3eueYWsxMREPfXUUzZXVsqt/HoN5pe6deua/3f0KlmOvmZyIv2Vxxxpg+nPSTExMTZX1HNHeXGeclT613bt2rVtJt/OjCNt+Pqhs478ndNfRW7v3r3Zrg8A+Y2gCAByKH1PoNatW+eo23tQUJB5KeerV6/aXO1KunZp9DS7d+82J7p1RvptnT592ulJUNNUrFjR/P/186lkZP369bnaX1Yc7dGUJj4+XmvXrs12vfTHbO3atXaTN+dG7969zV5ZW7Zs0ZIlS3TmzBlJ10K4Ll265Nm+MpI2kXpWwsPDbb6AZXQJ+/SXFk8/ofvNIP0XwUuXLjn0GEcnXU6TUU9BZ1ksFnXo0MG8nZOeBj4+Ppo7d655Fam0sCgsLCxPasuv12B+Sd+W165dm239CQkJZs+/vFS8eHHz/5cvX852/YoVK6p27drm7bxsXwVRXp2nHJHTNrx9+3abqzdm5vrAyZFzTcuWLc2rHEZERNgMSQYAVyAoAoAciImJ0aZNm8zbjgxDSc9isdgMJ7n+i/Y999yjChUqSLr2K+Qbb7zh9Dw/jRo1srmy2ttvv52rCTPT/2q7d+9eM+TISFxcnM3cD3mtTJkyNkPh9uzZk+X606ZNc6h30wMPPGB+yE9KStLbb7+du0LTSZvUWro2N8Zbb71l3telSxebL5D5YceOHdq6dWuW60yfPt389btMmTI2IUWaAQMGmL+Y79y5U99//33eF5tPypUrZ/4/NjbWoXmoypcvb/4/u5AlPDxcISEh2W4zJ7370s+JktX8RBkpW7as5s6daw5pTEhI0JNPPpknPRby6zWYX3r27Gn+/+zZsza9OzMya9asfKk3/fBNR4e3Pv744+b/Q0JCcvUDQkGXV+cpR6Q/H/zzzz9Zng+uXLmiyZMnO7TdUqVK2UyA7cjf2d/fX/fff795O7fv1wCQWwRFAJADK1euNHsYFC5c2KkPqOnDpQMHDujgwYPm7cKFC+vFF180b//222964YUXsvwAm5SUpLlz52b4pWbEiBHml/qjR49q0KBBOnfuXKbbunLlipYuXZrhPBFBQUHml5yUlJRMQ6y4uDgNHz48yyAptwoXLqygoCDz9nvvvZfhBLWGYejzzz/X119/7dB2fXx89OSTT5q3V6xYoQkTJmT5y/+FCxccDsXSDz9Lv838nMQ6vREjRujQoUMZ3vfFF1/YzL312GOPZXjVp9q1a9s8j9dee03ffPNNtuFHZGSkPvnkE7355ptOVp97/v7+5lwghmFo3rx52T6mefPm5v/DwsIy7dERHh6uJ5980qFw4Z133tH7779vM/Qls22mDzSaNWuW7bav5+vrq3nz5qlWrVqSrvXsGTx4cK6HVeXXazC/BAQE6O677zZvv/vuu5kO5Vu1apXNRN15KX3gvmzZMofCyl69eplzTiUmJurxxx93aGjyoUOHNHbsWC1dutT5gl0gL85TjmjUqJE5d9Xly5c1adKkDM9jCQkJevHFF3XgwAGHtuvp6WkO+5SkBQsWOHTVueeff94c4n3o0CE98cQT2fZgSk1N1a+//qrBgwfryJEjDtUHAI7gqmcAkAPpewC1bNnSoauzXK9p06YqV66cIiMjzW2OGTPGvL93797avn27ua9169Zp586d6tmzp5o2baqyZcvq8uXLOnnypHbt2qWff/5ZCQkJ6tOnj92+7rzzTj3zzDPm5Xz37Nmjzp07q1u3brrzzjtVrlw5paSk6PTp0woLC9NPP/2k2NjYDIcUFSpUSAMHDtT7778vSfrll1/0n//8Rw899JCqV6+uxMREhYWFadGiRYqOjlZwcLCOHz+eb5N/Dhw40LwE+cGDB9WjRw89+uijql+/vgzD0JEjRxQaGmrOR9K3b1+bS9FnZtiwYeaVpyTp66+/1i+//KIePXqoUaNGKlOmjBITE3Xs2DHt3LlTGzdulJeXlwYPHpztttMmtU4/uXhAQIDN/BT55f7779ePP/6oBx98UH379lWrVq1UsmRJnTx5UsuXL9eOHTtsakofmF3vtdde08GDB/X777/rypUreuONN7RgwQLdd999qlevnsqUKaPk5GTFxsbq77//1u7du7Vnzx6lpqbm+xC77HTr1s0MiD766CMtXbpUtWrVsukBMGDAAPOS8sHBwapTp44Z6L766qvasmWL7r33Xvn6+ur8+fPaunWrli1bpqSkJAUGBqpIkSJZBjFxcXGaP3++Zs2apaCgIAUHByswMFBly5ZVoUKFFBUVpV27dmnZsmVmjyJvb2+nLy3v5+en+fPna8CAATp69Kji4uI0ePBghYSEODS3UGby6zWYX8aNG6ddu3YpPj5eycnJevLJJ9WtWzd17NhRvr6+Onv2rNasWaN169ZJutbTz5GhUDnRrVs3zZkzR4Zh6MCBA7rrrrtUr149lSpVypy/6Pbbb9dLL71kPsbLy0sff/yxHnzwQZ0/f17nzp3To48+qjvvvFPt27dXzZo1VaJECSUmJioyMlIHDhzQ1q1bzZ5H9evXz9PnkJ/y8jyVnaJFi6pv375asGCBJGnp0qU6cuSI+vbta76n7du3T4sXL9aZM2dUvHhxtW/f3ryCZVa6detmngOWLFmijRs36vbbb7cZlta1a1d17drVvF29enVNmTJFzz//vFJTUxUWFqZ7771XnTt31p133qnKlSvLy8tLcXFxOnnypPbv36/Nmzebc6Lldh5CAEiPoAgAHPT333/rr7/+Mm9ff2l7R1ksFnXu3Nm8gtHKlSs1cuRIFSr0/6fkd955R8WKFTN7E5w/f17z5s1zqAfE9Z577jkVLlzY7K6fmJioRYsWadGiRTne1hNPPKFNmzaZv2b/8ccfGU4MW7t2bX344Yf5OkFzp06d9OCDD2rJkiWSrk2e/e6772a47qBBg3T33Xc79CXV09NTM2fO1IgRI/TTTz9JujZnxMyZMzN9jKO/aFssFvXt21fvvfeeuSy/J7FOM3HiRB0+fFiHDh3SV199lekVtKpUqaLZs2dn+Zy8vLwUEhKi0aNHm/POHD58WJ988km+1J6XnnvuOW3bts3ssXD69Gm7X+3vuece8/8Wi0VTp07Vww8/rLi4OBmGoVWrVmV45UN/f399+OGHDl/a2jAM7dmzJ9thW8WLF9eMGTPMYanOKFeunObNm6eBAwfq2LFjunjxogYNGqS5c+c6PRlwfr0G80uVKlU0c+ZMPfnkk0pKSlJqaqpWrFihFStW2K3bs2dPPfDAA3keFNWtW1dDhw7V559/LulaD6Hrewdl1MuoatWqWrx4sYYNG6Z///1X0rU5c9xtLpu8PE854uWXX9bOnTvNIDgsLCzDIaZeXl6aMmWKQ/PzSdIjjzyi9evXm8FWZGSk+eNQmvQTrKfp1KmTPv/8c40YMUJxcXG6cuVKpucbAMhPDD0DAAel72VTqFAhmy+TOZV++FlUVJQ2b95sc7+np6feeOMNhYSEKCgoyOZKOderXr26XnzxxSznuHn66ae1ePFitWnTxpwwMyP+/v566qmnbK5slZ6Xl5e++OIL/ec//8lwO15eXnrwwQe1ePFilS1bNtP95JW33npLI0aMyHRC8apVq2ratGkaPXp0jrZbtGhRffzxx/rggw/MyYAzExgYaPPrf3bShpBI145X+rlT8lOpUqX07bff6oEHHsjwy1WhQoXUp08fLVu2zJxwPSvFixfXRx99pM8++yzbNurp6amgoCC9+uqrGjduXK6eR26VLFlSixcv1rhx49S6dWuVK1fOpjdRRm6//XZ99913mU6aW7hwYXXp0kXLly9XzZo1s62hX79+euCBB7INfooUKaJu3bpp5cqVat26dbbbzY6/v7/mz5+v6tWrS7o2bPKJJ56wGf6aU/n1GswvzZo107JlyxQcHJzh/WXKlNErr7ySaeCVF1566SXNmzdPPXr0UM2aNVW8ePEsXz9pqlWrptDQUI0dOzbTc3SatN4v77//foa9TQuqvD5PZad48eJauHChevfunel7Y1BQkL777jub+QWzU7hwYYWEhGjy5Mlq3769KlasaA5zy067du20Zs0aPfHEE9nOS1auXDn16dNH8+fPN4eXAkBesBj0UwSAAu/cuXPavXu3oqKiFBcXp+LFi6tChQqqV6+eqlWrlqNtXbhwQTt37tTZs2d14cIFFS1aVP7+/goMDDQnvXVETEyMtm3bpoiICHl6eqpixYpq0aKFfHx8cvr0ci0+Pl6//fabjh8/ritXrsjPz0+1a9fOsyFd4eHh2rt3r6KiopSYmKgSJUqoSpUqatCgQY6/rLz66qtatmyZpGtDD9KG8uW1kydPqmPHjubt9L+Enz9/Xjt27FBERISuXr2qihUrqmXLlrkK92JiYrRnzx6dPXtWFy9eVOHChVWmTBnVqFFDderUydHVAQuyf/75R2FhYYqNjVWJEiXk7++v5s2bq0yZMk5t7/Tp0zp06JBOnTqluLg4WSwWeXt7q1atWmrYsOFNc9zy+zWYH44dO6Y9e/YoKipK3t7eqlKliu68885c91K5UY4dO6Y///xT0dHRSkhIUPHixeXr66tatWopICDAZrLxgupGn6eycvbsWe3YsUNnzpxR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5jn9DJCRrl27GgsWLLCpI/1ngICAAGP8+PE2j+nbt6/x+uuvG4bx/+fnRYsWmfentfN///030/0OGTLEmDx5snm7f//+xv3332/zXN977z3j/vvvNwzDcOj9Z+nSpUbTpk3t9pX+OW3evNmoU6eO+V7hiIxqvf5vl/6YdenSxZg1a5Z529n3vltJ//79jV69epm30953t27dai7bsGGDERAQYFy6dMkwDMP44YcfjObNmxuXL182DOPaZ/nAwEAjPDw8023MnDnTCAgIME6cOGEuGzdunM1nioz+viNHjjRvp6amGi1btjS+/vprwzAM4+uvvzaCg4PNugzDMBYtWmTzuSUr69evN5o2bWpcvXrVOHDggNG6dWvjrbfeMt577z3DMAzjtddeMz+P5OR8f+DAAXOdI0eO2Lz3GIZh/Pvvv0ZAQIDdZ37kTnbnsvTni40bNxr16tUz3+8NwzB+/fVXm3O7I+3L0c/F6V9jjrj++15CQoIREBBgbNy40TCMjM+569atMwICAszbznx+Stt3Vu89y5cvNzp37mxznC9fvmw0atTI2Lx5s2EY1z4/tWrVyjxH3GyY4KKAqFOnjlq2bKnu3burTZs2atOmjTp37qzSpUtLkm677TabXyf8/Px0++23m7c9PT1VpkwZm2Q+rWdSeHi4EhMTdfXqVXl7eztUz/Hjx5WUlGT3a9iVK1dUt25dm2UNGzbM0XOtXLmyTR3ly5d36heF9L2XfH19JUkBAQE2yy5fvqz4+HhzfxUrVpS/v7+5TlBQkFJTU3X06FGVKFFCJ06c0GuvvaZx48aZ61y9elUlS5a02XeDBg1yXC9y79ChQ0pJSbHrupmcnGyO6R84cKDeeOMNbdmyRa1atdK9996rOnXqSJIefvhhPf/88/rrr7/UunVr3XPPPQ7P15HewYMHtWPHDgUFBdndd+LECdWsWdPhbeXmtfbEE09o7Nix+v7779WqVSvdd999qlatWg6eCW6k63tclitXTtHR0Tp8+LAqVKigihUrmvfddtttKlWqlI4cOaJGjRpJsj93+vn5ydPT0+69Ie186uh2szovlitXznycp6enTe2HDh0y91OoUCE1btzYvN/Hx0c1a9a06fVRrFgxm/aZ/tyfmJiY7fm3d+/eGjRokO677z61bdtWd999Nz0689j17215fcwTEhL08ccfa8OGDYqMjFRKSoouXbqUbY+i68+1TZo0sRtSk/71ldZuY2JiVLt2baWkpOjzzz/XmjVrdPbsWV25ckXJyckqWrSozTYaN24si8Vis5+QkBClpKQ49P7jiAMHDqhChQqZvk84WmtW+vbtq++++05PPfWUoqKitHnzZs2bN8/hx9+q6tevb7cso3YVHR2tSpUq6Z577tHEiRO1bt06de3aVaGhoWrRooWqVKmS6TZ8fX1VrFgxVa1a1Vzm5+eX7bDx9NuwWCw25/qjR48qMDDQZnL6nHw2b9asmRISEvTXX38pLCxMzZs3V4sWLTRr1ixJ0s6dO81hQo6e7wsXLmxTc9rj0p9jateuzYU98klW57L0jh49qgoVKphtW5L52SD9Otm1L0c/F2f0GstO+nZUvHhxeXt72wxpc0ROPz+lyeq95+DBgzpx4oTd94jLly/bTH0SEBBwU81LlB5BUQHh6empkJAQ7dmzR7/++qsWLFigDz74QIsWLZIku0lrLRZLhstSU1MlSWFhYRo5cqSee+45tWnTRiVLltQPP/ygkJAQh+pJTEyUdG1ITPovEJLsGntOZ87PaAJeI90cAOlPbGnSuo+nl36ITdpjMlqWdkyyk/ac33zzTZs3QEl2E/ClDWXCjZWYmChPT0+zC3h6aX+Tvn37qk2bNtqwYYN+/fVXzZo1S6NHj9aAAQPUrl07/fLLL9q4caN+/fVXPf7443r00Uc1evToHNfRvn17jRw50u6+9G+2jm5Lcu619txzz6lbt27auHGjNm3apBkzZuiDDz5Qp06dclQDboyMztnpz33OPD6r94G8lNvas9uGI+ff+vXra/369dq0aZO2bt2qF198Ua1atdKMGTNyVAcyd/05Jq+P+ZQpU7R161aNHj1a1apVU9GiRfX888/nycTBWb3/z5kzR/Pnz9d///tfBQYGqlixYnrnnXdytF9H3n8ckV3gkxe19uzZU1OnTlVYWJjCwsJUpUoVu3k8YC+jz7Ppz1vXtysvLy/16tVLy5YtU6dOnbRy5UqbK51mtg1nztt5cQ7OTKlSpVSnTh399ttv+v333835UF988UUdPXpUx44dU/PmzXO0zaJFi2b4eR7uydHPxc5cbe36KRXSv148PDzsXgcZnSvz4/NTYmKi6tevr6lTp9rdl37C8Jv5CnMERQWIxWJR06ZN1bRpUw0fPlzt27e3mUgsJ8LCwlSpUiUNGzbMXJbdL3bp1a5dW15eXjp9+rSCg4OdqsFZZcuWtRlbHx8fbzMxWG5ERETo7Nmz5hfy33//XR4eHqpZs6b8/PxUvnx5hYeHq0ePHnmyP+StunXrKiUlRTExMVl+6K1YsaIefvhhPfzww5o2bZoWLVqkAQMGSLrWvnr37q3evXvr22+/1bvvvpvjoKh+/fr63//+p8qVK2d65bHChQvbveGkvdml/0Unt6+1mjVrqmbNmnr88cf18ssva+nSpQRFN5natWvrzJkzioiIMHv//Pvvv7p48aJq166d79vN6rzo6H6uXr2qvXv3mr+sxcbG6ujRo7rtttsc2oaj519vb2916dJFXbp0UefOnfXkk0/q/PnzbneVoIIkq2NeuHBhu1+osxIWFqbevXub56iEhASdOnUq28f9/vvv6tWrl3l77969dj0us7Jnzx517NhRPXv2lHTti/6xY8fsXl/XzwO0d+9eVa9eXZ6eng69/zhyPAIDA3XmzBkdPXo0w9eYo7VmxcfHR/fcc4+WLVum33//XX369HH4sciZvn37qlu3bvr666+VkpKie++994bXULNmTa1YscLmiko5vbBF8+bNtWPHDu3bt08vvviiypQpo9q1a+vzzz9XuXLlzLbq7Pm+Vq1aunr1qv7880+zx8qRI0d08eJFZ54yspHVuSy9mjVr6syZM4qKipKfn58k+7bjSPty5HNxfvDx8VFCQoISExPNwP7gwYN5tv2s3nvq16+vH3/8Ub6+vg6P2LnZMJl1AbF37159/vnn+uOPP3T69GmtXbtWMTExqlWrllPbq169uiIiIvTDDz/oxIkTmj9/fo5CJ29vbw0aNEiTJk1SaGioTpw4of3792vBggV2EzvntTvvvFMrVqzQrl279Pfff2v06NF5dknNIkWKaMyYMTp48KB27dqlt956S/fff7+Zdj///POaNWuW5s+fr6NHj+rvv//W0qVLHe6JhfxVs2ZNde/eXaNGjdLatWsVHh6uffv2aebMmdqwYYMk6e2339bmzZsVHh6u/fv3a8eOHeYH7A8//FA//fSTjh8/rn/++UcbNmxw6ov4I488ogsXLujll1/Wvn37dOLECW3evFmvvvqq+SWhcuXK2rt3r06ePKmYmBilpqaqcuXKslgs2rBhg2JiYpSQkOD0a+3SpUuaOHGiduzYoVOnTmn37t36448/chUswDVatWqlgIAAjRw5Uvv379e+ffs0atQoBQcH53horzPbze68mJ0aNWqoY8eOGjdunHbt2qWDBw/qlVdekb+/vzp27Ohwvdmdf0NCQrRq1SodPnxYR48e1Zo1a1SuXDmGLuSj7I555cqVtW3bNkVGRurChQvZbq969epat26dDhw4oIMHD2rEiBEO/YK7Zs0aLVmyREePHtWMGTO0b98+9e/f3+HnUb16dW3dulV79uzR4cOHNX78eJur/6U5ffq0Jk2apCNHjmjVqlX66quvzKtVOvL+U7lyZSUmJmrbtm2KiYmxuZJVmuDgYDVr1kzPP/+8fv31V4WHh5u9QnNSa3b69u2r0NBQHT582OaLDvJW7dq11bhxY02dOlVdu3bN0RDBvNK9e3cZhqFx48bp8OHD2rx5s7788ktJGffSz0hwcLC2bNmiQoUKmZ8jgoODtXLlSpsfsZw939eqVUtt27bV66+/rr179+rPP//U2LFjXXK8bgVZncvSa926tapWrarRo0fr4MGD2r17t6ZPn26zjiPty5HPxfmhcePGKlasmN5//32dOHFCK1eutJtgPjeyeu/p3r27fHx8NGzYMO3atUvh4eHasWOH3nrrLZuLS93M6FFUQHh7e2vnzp2aN2+e4uPjValSJY0ZM0bt2rXTjz/+mOPtdezYUY899ph5Bai7775bw4YN08cff+zwNl588UWVLVtWM2fO1MmTJ1WyZEnVq1dPTz/9dI7ryYmhQ4fq5MmTGjp0qEqWLKkXXnghz3oUVatWTZ06ddJTTz2lCxcu6O6779brr79u3t+3b18VLVpUc+bM0bvvvqvixYsrICBAjz32WJ7sH7k3adIkffbZZ5o8ebLOnTunMmXKqEmTJrr77rslXfv1deLEiTpz5oy8vb3Vtm1bvfrqq5Ku/dr7/vvv69SpUypatKiaNm2q999/P8c1+Pv765tvvtHUqVM1ePBgJScnq1KlSmrbtq0Zag4aNEhjxoxR165ddenSJa1fv15VqlTRc889p2nTpunVV19Vr169NHnyZKdeax4eHjp//rxGjx6tqKgo+fj46N5779Xzzz+f84MKl7JYLPr000/15ptvqn///rJYLGrbtq3NXD35ud3szouOmDRpkt5++209/fTTunLlipo1a6ZZs2bl6Cp82Z1/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9/cH4Pfff69yzksvvUR8fDy2trbMnDmTXbt23dfaD6uwsBCo+qhaYWEhP/74Y53uD7eaezdr1ozMzEwKCgrqfD8RERGpP0oUiYiISIPn4OCAtbU1586d4+bNm2bjd5pAJyUlVepRdPLkSaKioqpc8+uvv66yafTevXuBW0fTqtO9e3fi4+OxtrYmODjY7Ilqj5KbmxuWlpZkZGRUash9/fp1Pv3008eSuLGxsWHy5MkUFRURGBhYZRXTxYsX2bRpU53HIiIiInVLR89ERESkwbOxscHb25v09HR8fX3p0qUL1tbWGAwGRowYwfDhw0lMTCQ9PR0fHx9efPFFCgsLycrKYtCgQRw5csSsEXRsbCyLFy+mU6dOuLm5UVFRwbFjxzh9+jQtW7Zk4sSJNcZkMBiIi4vD39+foKAgYmNjefnllx/5e2/VqhV+fn6sW7cOX19f+vTpg62tLdnZ2dy8eZPhw4ezcePGR77vvaZMmUJOTg6bN2/m1VdfpUuXLri6ulJWVsYff/zByZMncXd3Z+jQoXUei4iIiNQdVRSJiIjIE2HBggX4+vpSUFBAcnIySUlJZGVlAbcqjpKSknj99dcpKysjLS2NixcvEhQURHR0dJXrhYWFMWTIEIqLi9m3bx/79+/HysqKCRMmsGXLFlOVUk169uzJypUrsba2JjAwkH379j3Kt2wyd+5c5syZg6urKz/99BPZ2dl4enqyYcMGXFxc6mTPe1laWhIZGcny5cvp27cv58+fZ+fOnWRnZ2NjY8OkSZNYuHDhY4lFRERE6o5Fxf0e2hcRERERERERkaeaKopERERERERERARQokhERERERERERG5TokhERERERERERAAlikRERERERERE5DYlikREREREREREBFCiSEREREREREREblOiSEREREREREREACWKRERERERERETkNiWKREREREREREQEUKJIRERERERERERuU6JIREREREREREQAJYpEREREREREROS2/wFds7rDpgI2cQAAAABJRU5ErkJggg==" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set_style(\"darkgrid\")\n", + "\n", + "\n", + "fig, ax = plt.subplots(figsize=(14, 7))\n", + "\n", + "for (task_number,\n", + " templ_1, templ_2, templ_3, \n", + " std_1, std_2, std_3) in zip(df.index, \n", + " df.template_1, df.template_2, df.template_3,\n", + " df.template_1_std, df.template_2_std, df.template_3_std\n", + " ):\n", + " plt.errorbar(list(range(task_number * 5, task_number * 5 + 3)), \n", + " [templ_1, templ_2, templ_3], \n", + " yerr=[std_1, std_2, std_3], \n", + " fmt='.',\n", + " elinewidth=3\n", + " )\n", + "\n", + "ax.set_xticks(list(range(1, df.shape[0] * 5, 5)), labels=list(df.task_name))\n", + "\n", + "ax.set_xlabel('task name', fontsize=15)\n", + "ax.set_ylabel('accuracy', fontsize=15)\n", + "\n", + "ax.set_title(\"Accuracy per task and template\", fontsize=25)\n", + "\n", + "\n", + "plt.show()" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:42:41.694401345Z", + "start_time": "2024-01-06T20:42:41.426854041Z" + } + }, + "id": "55ca88de3f300a7e" + }, + { + "cell_type": "code", + "execution_count": 47, + "outputs": [], + "source": [ + "df.to_csv('results.csv')" + ], + "metadata": { + "collapsed": false, + "ExecuteTime": { + "end_time": "2024-01-06T20:42:45.238681037Z", + "start_time": "2024-01-06T20:42:45.193992827Z" + } + }, + "id": "3549c0af8221ca83" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}