{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"2022-01-12-seq-mab-mushroom.ipynb","provenance":[{"file_id":"https://github.com/recohut/nbs/blob/main/raw/P296669%20%7C%20Sequential%20Batch%20Learning%20in%20Stochastic%20MAB%20and%20Contextual%20MAB%20on%20Mushroom%20and%20Synthetic%20data.ipynb","timestamp":1644607243833}],"collapsed_sections":["aJdhotjJuyCg","F_7QyQIsvraK","6SzDe38oviFg","Y635PDE6vgdI","UiTTsyhFvdwc","-IL38-vIzIG1","4L_OJQQEvP4k","oAuUEthsu9TG"],"authorship_tag":"ABX9TyNovRrJ5FnlW7E7l5a6PFNk"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"2b72cbdd08374942859625d2047795f2":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_396e4164d325484e9956f597c2e133e0","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_46ce32b9cbc74045b96fc2fbc93f0575","IPY_MODEL_596798eaeac14aaea8c3cc476b7f329f","IPY_MODEL_c60ea6ae22a2457786ca6b8e3446e3f2"]}},"396e4164d325484e9956f597c2e133e0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"46ce32b9cbc74045b96fc2fbc93f0575":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_342e5fcfeeb04720834331a4274b5e28","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_9cbda8d73a0a41f8acb9c3bdacdc7a9b"}},"596798eaeac14aaea8c3cc476b7f329f":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_042addbfa66d4dd4a8543124cc312905","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":23,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":23,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_3e9ddf2ca50f4c24bcf276eeeee63d01"}},"c60ea6ae22a2457786ca6b8e3446e3f2":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_ce6fa32eee4044df843b45c5693e065e","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 23/23 [00:09<00:00, 3.28it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_5ac6a207b502473fa8bd11d2adcc1201"}},"342e5fcfeeb04720834331a4274b5e28":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"9cbda8d73a0a41f8acb9c3bdacdc7a9b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"042addbfa66d4dd4a8543124cc312905":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"3e9ddf2ca50f4c24bcf276eeeee63d01":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"ce6fa32eee4044df843b45c5693e065e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"5ac6a207b502473fa8bd11d2adcc1201":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3d6f8baea53a484faab78b4c50fbf620":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_9689c9d0d5354f7782671e9b301c5840","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_4550c6895fa244efb6dd5cbc9dd98324","IPY_MODEL_b70c31ffb8784655ad0d4e59e12343d6","IPY_MODEL_c14978517f8047718a1c084947d702b0"]}},"9689c9d0d5354f7782671e9b301c5840":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"4550c6895fa244efb6dd5cbc9dd98324":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_60d54986769b4e859de45bbce659b7f1","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 6%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_0181512ceea0401db61675636ae223b5"}},"b70c31ffb8784655ad0d4e59e12343d6":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_4b34f4a343b242abaef58ebe57e07a4d","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"","max":16,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":16,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_476d47eec56d4ff0bec2900ed3505ba2"}},"c14978517f8047718a1c084947d702b0":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_27609bb3e0594b5084e01fae4b04cc9c","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 1/16 [00:08<02:13, 8.89s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_606916b9b63b43969a01e84ec142f341"}},"60d54986769b4e859de45bbce659b7f1":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"0181512ceea0401db61675636ae223b5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"4b34f4a343b242abaef58ebe57e07a4d":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"476d47eec56d4ff0bec2900ed3505ba2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"27609bb3e0594b5084e01fae4b04cc9c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"606916b9b63b43969a01e84ec142f341":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"b8cc488f50764d7a80c565e120acf3bd":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_73139f73ef7d4769807b6dc081a48fb1","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_8c0a7a56a8d946bf953390fd61675c4d","IPY_MODEL_63ead4d72b27495cac3bb6a385895123","IPY_MODEL_a1d8d9e611534997828fa51cdab2bd0a"]}},"73139f73ef7d4769807b6dc081a48fb1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"8c0a7a56a8d946bf953390fd61675c4d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_afe8ad0a833b4f399a1f6d8367786fd3","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 7%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_c55e9f4461c24c9f88ba2098ff957634"}},"63ead4d72b27495cac3bb6a385895123":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_4472bedf87ec41aeb3306d6364386540","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"","max":15,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":15,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_edc2a60460ef48bdb78972f403c14175"}},"a1d8d9e611534997828fa51cdab2bd0a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_d971324520f34ce5b3b6994ddd0d0102","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 1/15 [00:08<02:03, 8.81s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_6d4282c72b80490cbdb027d3592849ea"}},"afe8ad0a833b4f399a1f6d8367786fd3":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"c55e9f4461c24c9f88ba2098ff957634":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"4472bedf87ec41aeb3306d6364386540":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"edc2a60460ef48bdb78972f403c14175":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d971324520f34ce5b3b6994ddd0d0102":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"6d4282c72b80490cbdb027d3592849ea":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"77454d4570db40ad9d90ed0f9d80f019":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_efe993ec7ad34cfaac8ca10da8b06b25","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_a845d33bdbc048af807e19eb89699a1b","IPY_MODEL_e16dcd3650f64c61b1c53445f96d13d5","IPY_MODEL_124e06ade51442c3af9d364455ec278f"]}},"efe993ec7ad34cfaac8ca10da8b06b25":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"a845d33bdbc048af807e19eb89699a1b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_a87b20c55b6547d7bad171519b9c2029","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 29%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_ce8d826cba9f41f8bb33997ceceab3c0"}},"e16dcd3650f64c61b1c53445f96d13d5":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_3ad0f66ba72c47ce8537870c6af56c0c","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"","max":14,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":14,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_3f68a6b94c614e87aea69a1fecf11d2e"}},"124e06ade51442c3af9d364455ec278f":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_3b3af273314945ef951076ac38deb74c","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 4/14 [00:08<00:16, 1.64s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_ffd1831574034bc59136368ad3e60108"}},"a87b20c55b6547d7bad171519b9c2029":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"ce8d826cba9f41f8bb33997ceceab3c0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3ad0f66ba72c47ce8537870c6af56c0c":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"3f68a6b94c614e87aea69a1fecf11d2e":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3b3af273314945ef951076ac38deb74c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"ffd1831574034bc59136368ad3e60108":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d8e841629bac43fbbea7f0a924aa9b94":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_dcde233fe4804bd8be4a35f7a781a985","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_a31bcdbac3f54376814d4b9cd40d545b","IPY_MODEL_806b8ca3d7fe4e05b22b038a82eb4545","IPY_MODEL_a26e8dfe75d540208dae3d35a0444551"]}},"dcde233fe4804bd8be4a35f7a781a985":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"a31bcdbac3f54376814d4b9cd40d545b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_9a8c2b7f24ad47dea0cc84b99639f151","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 23%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_721da9071ffc493d97a523d2f2ac4f59"}},"806b8ca3d7fe4e05b22b038a82eb4545":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_0f5ac0bc528b4fa1b8d5a7aafeb36c79","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"","max":13,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":13,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_a37b2e9543074546bf43c7741f3a5650"}},"a26e8dfe75d540208dae3d35a0444551":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_f95e707810f3426eb20134bad69e6a7f","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 3/13 [00:08<00:21, 2.19s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_c065af81128d4149b26e71b7a6cb4c14"}},"9a8c2b7f24ad47dea0cc84b99639f151":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"721da9071ffc493d97a523d2f2ac4f59":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"0f5ac0bc528b4fa1b8d5a7aafeb36c79":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"a37b2e9543074546bf43c7741f3a5650":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"f95e707810f3426eb20134bad69e6a7f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"c065af81128d4149b26e71b7a6cb4c14":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"153549b4beb84e54b5fe4bec2eecf075":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_d7e2ff7ce49d44588f16e7abfbb9885c","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_6a821f0913784d64b2e98282b6ae15a1","IPY_MODEL_f736e0b03dea46dea371a5abcbcde9d7","IPY_MODEL_f0f773f30026425fa0dfdcefd1f7d2dc"]}},"d7e2ff7ce49d44588f16e7abfbb9885c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"6a821f0913784d64b2e98282b6ae15a1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_914c417613a446c28921a6cb430218dc","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 8%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_76e6aa6b457347af8ef3146d3d1e7437"}},"f736e0b03dea46dea371a5abcbcde9d7":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_3d87aae69d6149fc98c0b0a642fd9194","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"","max":12,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":12,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_4a588c2572094039983c106ffd558d86"}},"f0f773f30026425fa0dfdcefd1f7d2dc":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_346efff4305041a5bd4913a00ebae73a","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 1/12 [00:07<01:26, 7.87s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_3a36af3ccfd54942b5e4643c373f60a2"}},"914c417613a446c28921a6cb430218dc":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"76e6aa6b457347af8ef3146d3d1e7437":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3d87aae69d6149fc98c0b0a642fd9194":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"4a588c2572094039983c106ffd558d86":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"346efff4305041a5bd4913a00ebae73a":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"3a36af3ccfd54942b5e4643c373f60a2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d1538f6f3b7641ccb48e2bbdef414389":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_3810f04feb094355bdc304447a3356b5","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_2528ae76b0a7423a8910adf401a5514a","IPY_MODEL_d8d6807eee1e44f78e10dcd5251c3e58","IPY_MODEL_21eac8d36aaf4fa2a0565329dedd965b"]}},"3810f04feb094355bdc304447a3356b5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"2528ae76b0a7423a8910adf401a5514a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_411e0eeb49834c04bbca486de6d10b5d","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 9%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_d3282d958c424f84a1b0e2f65dc6602b"}},"d8d6807eee1e44f78e10dcd5251c3e58":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_28e68ecc22cf450d8ac9b8067ea0f801","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"","max":11,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":11,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_310d810b45114471bbc5a6658de789df"}},"21eac8d36aaf4fa2a0565329dedd965b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_9c7bed0810f34fe5948110f9c4ad1894","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 1/11 [00:07<01:14, 7.48s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_c8dc39d329de455ea39ec34406e6bd59"}},"411e0eeb49834c04bbca486de6d10b5d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"d3282d958c424f84a1b0e2f65dc6602b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"28e68ecc22cf450d8ac9b8067ea0f801":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"310d810b45114471bbc5a6658de789df":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"9c7bed0810f34fe5948110f9c4ad1894":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"c8dc39d329de455ea39ec34406e6bd59":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"87c240ca0fe8431096f5092d00b6d63f":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_6933623da13c468ea1caba8cb1e126f5","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_3beaa54b58654d2199153c4229b50f84","IPY_MODEL_317c46945fd64488ad7b2cc0bf30b7d2","IPY_MODEL_fa2e58ea24f84364b95fcc3f1587e9ad"]}},"6933623da13c468ea1caba8cb1e126f5":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3beaa54b58654d2199153c4229b50f84":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_afa78843d54d404ab99cd87d55a36bb9","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_0c9761efc1a04534871cb6c05f232f4a"}},"317c46945fd64488ad7b2cc0bf30b7d2":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_21b40574fdb44788af67ece3c7b770c6","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_0a8e3b93b06740ad8cb9075dbf5d041a"}},"fa2e58ea24f84364b95fcc3f1587e9ad":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_bcaa037ccf1b47bf8d40956a370f93dc","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [00:07<00:00, 1.31it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_2258f153219f48cc882eda53f0db33a2"}},"afa78843d54d404ab99cd87d55a36bb9":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"0c9761efc1a04534871cb6c05f232f4a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"21b40574fdb44788af67ece3c7b770c6":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"0a8e3b93b06740ad8cb9075dbf5d041a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"bcaa037ccf1b47bf8d40956a370f93dc":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"2258f153219f48cc882eda53f0db33a2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"6574536e49dd498bae5d87ab60144c59":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_a787648e15174568a65f7b5e17ee43d2","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_9fccdb73039f4b649f5389aa2b4099ad","IPY_MODEL_701a04ff58fc492f88774aa7139dcbc2","IPY_MODEL_37296861808045328c2c4eb74625987a"]}},"a787648e15174568a65f7b5e17ee43d2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"9fccdb73039f4b649f5389aa2b4099ad":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_8a9c221fcb4a46f9af525b5b0373a598","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_f155f2ec83cb416d8d375ae77330165b"}},"701a04ff58fc492f88774aa7139dcbc2":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_af831b75ff7146fc99abb8677c84bdf3","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":1000,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":1000,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_8fe71971bf8049bca4a5c6fde2bf7471"}},"37296861808045328c2c4eb74625987a":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_9a87fac6283543008f922a57f98b8514","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 1000/1000 [10:38<00:00, 1.62it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_ea8e8fab825a499c8fe628a021b731ca"}},"8a9c221fcb4a46f9af525b5b0373a598":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"f155f2ec83cb416d8d375ae77330165b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"af831b75ff7146fc99abb8677c84bdf3":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"8fe71971bf8049bca4a5c6fde2bf7471":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"9a87fac6283543008f922a57f98b8514":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"ea8e8fab825a499c8fe628a021b731ca":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d2a7f4cc89a44501b6423cff8f76f77d":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_9231d7a857624fbfa4c6dc1ba3307814","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_7dbee5d5ef884477be34e5a9889d13b1","IPY_MODEL_ed0108c515b94090bc7ee284284b535b","IPY_MODEL_ef228c5730d943149399ec81f4de4d46"]}},"9231d7a857624fbfa4c6dc1ba3307814":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"7dbee5d5ef884477be34e5a9889d13b1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_0dd4ce26eb994bf89f9d429982672f1d","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_3c78bcaf65d745928c7cec9b3618f2f4"}},"ed0108c515b94090bc7ee284284b535b":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_3f9147ea50504b5e941cf600259b64c6","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":1000,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":1000,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_3cb22a9a850b42ce8d72132b34cede77"}},"ef228c5730d943149399ec81f4de4d46":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_3929bb10e2044d26869495a947ecd340","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 1000/1000 [13:01<00:00, 1.28it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_cf4c98d2628e418b84ef3c798588675a"}},"0dd4ce26eb994bf89f9d429982672f1d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"3c78bcaf65d745928c7cec9b3618f2f4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3f9147ea50504b5e941cf600259b64c6":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"3cb22a9a850b42ce8d72132b34cede77":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3929bb10e2044d26869495a947ecd340":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"cf4c98d2628e418b84ef3c798588675a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"959b3e666a064b6d8917c8625ecd8fee":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_ba3a1e89d28342f683d0013065137cb2","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_53079098231c4906af72b59e6773052f","IPY_MODEL_3415712fbd16477b8eb7bf6844c56d51","IPY_MODEL_7269023608aa4b9c833466b4634a02cd"]}},"ba3a1e89d28342f683d0013065137cb2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"53079098231c4906af72b59e6773052f":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_23ca025a590c4caba147cfee82b8fb82","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_6892149d580c4521bfbc8ce341445d61"}},"3415712fbd16477b8eb7bf6844c56d51":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_0767ce00fdc24b709c3ca2169e13e545","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_c11a3dcd03f24240826793c233950bea"}},"7269023608aa4b9c833466b4634a02cd":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_ff5a4612a01b47a8a805ca8a643956c3","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [00:27<00:00, 2.75s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_f8e2be434a1846c797556912bad038f1"}},"23ca025a590c4caba147cfee82b8fb82":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"6892149d580c4521bfbc8ce341445d61":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"0767ce00fdc24b709c3ca2169e13e545":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"c11a3dcd03f24240826793c233950bea":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"ff5a4612a01b47a8a805ca8a643956c3":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"f8e2be434a1846c797556912bad038f1":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"85a8b0c33c104b8eb22fe9e21dc3d543":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_f8a6e8d21951434b84789ff596bf188b","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_3825eaf811174f30b38725c44d1536a6","IPY_MODEL_f0fad1d578be4cb790bcbc91e2088d85","IPY_MODEL_367d61cced8a4b7a9eb3763f11856cce"]}},"f8a6e8d21951434b84789ff596bf188b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3825eaf811174f30b38725c44d1536a6":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_0655f854114a4705ba29eabd0cc99e31","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_f06c08cde5e14462a35c9b411e3cb167"}},"f0fad1d578be4cb790bcbc91e2088d85":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_d769f331f73d42a1ae05b69c07023890","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_52ec6649d8e94615bf9397cbd9d85b48"}},"367d61cced8a4b7a9eb3763f11856cce":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_fa0bd788f3a8421d949951e60f790c07","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [00:26<00:00, 2.71s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_2464f2977ba04e8a855461a081005305"}},"0655f854114a4705ba29eabd0cc99e31":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"f06c08cde5e14462a35c9b411e3cb167":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d769f331f73d42a1ae05b69c07023890":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"52ec6649d8e94615bf9397cbd9d85b48":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"fa0bd788f3a8421d949951e60f790c07":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"2464f2977ba04e8a855461a081005305":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"07d74cc8c1034e8e88e0ba68681e7d83":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_20755197a75045769c76c25cf9997309","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_3aaecc6ab5334dbaaff91f3fd3d2dc92","IPY_MODEL_ccdfd084e55f4d48aa8d62ff900c54dc","IPY_MODEL_602801fccd6d4538bd22a5494c8a538e"]}},"20755197a75045769c76c25cf9997309":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3aaecc6ab5334dbaaff91f3fd3d2dc92":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_81b219b6e4414ff888646a18f038c6d2","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_4622f6b8c7914be18ec086e119b14510"}},"ccdfd084e55f4d48aa8d62ff900c54dc":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_c603ecbfec974667805abf5f8366dde5","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":20,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":20,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_508403ada600443f97467dde6fb0dd3d"}},"602801fccd6d4538bd22a5494c8a538e":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_9840772f43134cee8eabacd2509f9fd7","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 20/20 [00:15<00:00, 1.29it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_4e96a7f4873f4360b2118e7a3ddbfc48"}},"81b219b6e4414ff888646a18f038c6d2":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"4622f6b8c7914be18ec086e119b14510":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"c603ecbfec974667805abf5f8366dde5":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"508403ada600443f97467dde6fb0dd3d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"9840772f43134cee8eabacd2509f9fd7":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"4e96a7f4873f4360b2118e7a3ddbfc48":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"c19256a397ea4e79b3a0cbf5a424a3ea":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_4d1f5676bbaa4b3d8b81cc7be3cf6da3","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_eae2220f0119401a8759637bcf0e9f4c","IPY_MODEL_4aa44dd37d5243dfa24fea8f3dc6839b","IPY_MODEL_2deab0a58cd04226b834a99ee4ff4c90"]}},"4d1f5676bbaa4b3d8b81cc7be3cf6da3":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"eae2220f0119401a8759637bcf0e9f4c":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_16acd859901c4b8aa5f6b4473b74e249","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_e4edb80a747a4e9684a556ff96563e7f"}},"4aa44dd37d5243dfa24fea8f3dc6839b":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_3d74bbdd72dc4e0aadb4bd517358bbe7","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":20,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":20,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_809de5d470244a2b90daffd0477c28a4"}},"2deab0a58cd04226b834a99ee4ff4c90":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_4e13cae2ba7a44daa51794431d7af0c0","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 20/20 [00:15<00:00, 1.31it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_2780d1d40a0644c498e860cf4839ac25"}},"16acd859901c4b8aa5f6b4473b74e249":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"e4edb80a747a4e9684a556ff96563e7f":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3d74bbdd72dc4e0aadb4bd517358bbe7":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"809de5d470244a2b90daffd0477c28a4":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"4e13cae2ba7a44daa51794431d7af0c0":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"2780d1d40a0644c498e860cf4839ac25":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"a2c68a56898548f8a7e190dcf2d034f4":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_e009631910e042a2a07afe8cf0e6d118","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_a850623290b14d07838e4203a29f9ba2","IPY_MODEL_9f140b090cb44361b39a6e09205c087c","IPY_MODEL_36fc4560cb99439c945c620138005a1b"]}},"e009631910e042a2a07afe8cf0e6d118":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"a850623290b14d07838e4203a29f9ba2":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_638ee1bca5d64cc7966556e3fb64c06e","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_a454e1e1460046e3a98a4b28c48ecda0"}},"9f140b090cb44361b39a6e09205c087c":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_d0a15e2054af430bad52b6fc28fd0994","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_f9295dd431fe4587a816d6c59f464399"}},"36fc4560cb99439c945c620138005a1b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_41ca699547f14bda8a83777d78e6bc86","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [15:36<00:00, 95.65s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_c29bc574f0cd46309d8eb6ec40378025"}},"638ee1bca5d64cc7966556e3fb64c06e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"a454e1e1460046e3a98a4b28c48ecda0":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d0a15e2054af430bad52b6fc28fd0994":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"f9295dd431fe4587a816d6c59f464399":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"41ca699547f14bda8a83777d78e6bc86":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"c29bc574f0cd46309d8eb6ec40378025":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"858e460d943744248a4109a5c328d77c":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_700c0953693b48bea968c6c67964684d","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_c70158af000c40e59b588e745be4a2dd","IPY_MODEL_21b1b038a25f469295ea8e2b75c470ae","IPY_MODEL_c20bc14a583e452ba263c4e4f4f3147e"]}},"700c0953693b48bea968c6c67964684d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"c70158af000c40e59b588e745be4a2dd":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_e1199401ceee4d0ca1aaa72020618241","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_57b794458691470ba34efd35f0cd8a9c"}},"21b1b038a25f469295ea8e2b75c470ae":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_4bd9a0cc11664bf4870c7fc46d151bda","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_301a50e882864065b9108e0a0cf0edde"}},"c20bc14a583e452ba263c4e4f4f3147e":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_93f8c74e75504aadbf1cdec1c5b6a43f","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [00:14<00:00, 1.43s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_a4d3c862e74242e4beeaaa880f4e3fc8"}},"e1199401ceee4d0ca1aaa72020618241":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"57b794458691470ba34efd35f0cd8a9c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"4bd9a0cc11664bf4870c7fc46d151bda":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"301a50e882864065b9108e0a0cf0edde":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"93f8c74e75504aadbf1cdec1c5b6a43f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"a4d3c862e74242e4beeaaa880f4e3fc8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"79e9b193d9284e4b898cb4344db92ef3":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_8ea51857d7cf48c1beddb0a9bd3b764b","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_7b0e4960186b4307ae594b269043c16d","IPY_MODEL_aa39361015a84c158e922f8e0b8dca9a","IPY_MODEL_63acbf6a68e6455c91cbea40169d1ee9"]}},"8ea51857d7cf48c1beddb0a9bd3b764b":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"7b0e4960186b4307ae594b269043c16d":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_e2c2139f96b345768e075ef3593fac06","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_3dcbffa6176e4824b9a48cccfaf024cc"}},"aa39361015a84c158e922f8e0b8dca9a":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_740c9d9905b542d4a0edef78f1d8ca30","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_cd2dc9d9c7504cd4b118a33b7c24f683"}},"63acbf6a68e6455c91cbea40169d1ee9":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_33707c49e4fd42ad932dd74e59f4a060","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [02:13<00:00, 13.01s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_60745768aedc4942bad8883d708b0e25"}},"e2c2139f96b345768e075ef3593fac06":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"3dcbffa6176e4824b9a48cccfaf024cc":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"740c9d9905b542d4a0edef78f1d8ca30":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"cd2dc9d9c7504cd4b118a33b7c24f683":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"33707c49e4fd42ad932dd74e59f4a060":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"60745768aedc4942bad8883d708b0e25":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"48077097754d4b96b1345fb1c06560b8":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","model_module_version":"1.5.0","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_760943cea30f4236a0715b61a047fd99","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_3bf9f4be47424b13b1db937f67894360","IPY_MODEL_28c1b766f56c41179840f2140da35b44","IPY_MODEL_487beca1cfc847c0a41a414968097b6b"]}},"760943cea30f4236a0715b61a047fd99":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3bf9f4be47424b13b1db937f67894360":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_c28b5aecd2eb4353b99534e8eef2380c","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":"100%","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_f167c63d8ac54b07b31b261c77a98391"}},"28c1b766f56c41179840f2140da35b44":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","model_module_version":"1.5.0","state":{"_view_name":"ProgressView","style":"IPY_MODEL_4a8e550188ac481fa2838df0996d3b0b","_dom_classes":[],"description":"","_model_name":"FloatProgressModel","bar_style":"success","max":10,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":10,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_50dfc1413ebd4298af9fc979de4ebb63"}},"487beca1cfc847c0a41a414968097b6b":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_view_name":"HTMLView","style":"IPY_MODEL_f36eb7ce107741159cfc86169724580f","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 10/10 [00:49<00:00, 5.04s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_5b4edf526246433d8cca04eba8be3229"}},"c28b5aecd2eb4353b99534e8eef2380c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"f167c63d8ac54b07b31b261c77a98391":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"4a8e550188ac481fa2838df0996d3b0b":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"50dfc1413ebd4298af9fc979de4ebb63":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"f36eb7ce107741159cfc86169724580f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"5b4edf526246433d8cca04eba8be3229":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}}}}},"cells":[{"cell_type":"markdown","source":["# Sequential Batch Learning in Stochastic MAB and Contextual MAB on Mushroom and Synthetic data"],"metadata":{"id":"i_1jvK-oGLjU"}},{"cell_type":"markdown","source":["## Executive summary\n","\n","| | |\n","| --- | --- |\n","| Problem | Learning user preferences online might have an impact of delay and training recommender system sequentially for every example is computationally heavy. |\n","| Hypothesis | A learning agent observes responses batched in groups over a certain time period. The impact of batch learning can be measured in terms of online behavior. |\n","| Prblm Stmt. | Given a finite set of arms ⁍, an environment ⁍ (⁍ is the distribution of rewards for action ⁍), and a time horizon ⁍, at each time step ⁍, the agent chooses an action ⁍ and receives a reward ⁍. The goal of the agent is to maximize the total reward ⁍. |\n","| Solution | Sequential batch learning is a more generalized way of learning which covers both offline and online settings as special cases bringing together their advantages. Unlike offline learning, sequential batch learning retains the sequential nature of the problem. Unlike online learning, it is often appealing to implement batch learning in large scale bandit problems. In this setting, responses are grouped in batches and observed by the agent only at the end of each batch. |\n","| Dataset | Mushroom, Synthetic |\n","| Preprocessing | Train/test split, label encoding |\n","| Metrics | Conversion rate, regret |\n","| Credits | [Danil Provodin](https://github.com/danilprov) |"],"metadata":{"id":"bLatuDpMGLge"}},{"cell_type":"markdown","source":["### Environments\n","\n","| Name | Type | Rewards |\n","| --- | --- | --- |\n","| env1 | 2-arm environment | [0.7, 0.5] |\n","| env2 | 2-arm environment | [0.7, 0.4] |\n","| env3 | 2-arm environment | [0.7, 0.1] |\n","| env4 | 4-arm environment | [0.35, 0.18, 0.47, 0.61] |\n","| env5 | 4-arm environment | [0.40, 0.75, 0.57, 0.49] |\n","| env6 | 4-arm environment | [0.70, 0.50, 0.30, 0.10] |"],"metadata":{"id":"y-pKQhr9GaAv"}},{"cell_type":"markdown","source":["### Simulation\n","\n","| Application | Policy |\n","| --- | --- |\n","| Multi-armed bandit (MAB) | Thompson Sampling (TS) |\n","| Multi-armed bandit (MAB) | Upper Confidence Bound (UCB) |\n","| Contextual MAB (CMAB) | Linear Thompson Sampling (LinTS) |\n","| Contextual MAB (CMAB) | Linear UCB (LinUCB) |"],"metadata":{"id":"QPyNX42KGiaR"}},{"cell_type":"markdown","source":["## Process flow"],"metadata":{"id":"4veQdUjFGCwk"}},{"cell_type":"markdown","source":["![](https://github.com/RecoHut-Stanzas/S873634/raw/main/images/process_flow.svg)"],"metadata":{"id":"Pm8qSJsaGEUN"}},{"cell_type":"markdown","source":["## Setup"],"metadata":{"id":"VAwEfoPurXGo"}},{"cell_type":"markdown","source":["### Imports"],"metadata":{"id":"ngwffbD4rXE3"}},{"cell_type":"code","source":["import pandas as pd\n","import numpy as np\n","from numpy.linalg import inv\n","from sklearn.metrics import roc_auc_score\n","from sklearn.model_selection import GridSearchCV, train_test_split, cross_validate\n","from sklearn.tree import DecisionTreeClassifier\n","from scipy.optimize import minimize\n","from lightgbm import LGBMClassifier\n","from scipy.stats import beta\n","import pickle\n","import os\n","import shutil\n","\n","import tqdm\n","from tqdm.notebook import tqdm\n","from multiprocessing.dummy import Pool\n","from IPython.display import clear_output\n","import matplotlib.pyplot as plt\n","\n","from torch.utils.data import Dataset, DataLoader\n","\n","from __future__ import print_function\n","from abc import ABCMeta, abstractmethod"],"metadata":{"id":"vSHj786VrXC8"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Data"],"metadata":{"id":"XXMnN2vioutk"}},{"cell_type":"markdown","source":["### Download"],"metadata":{"id":"W_L8uOd0rfK6"}},{"cell_type":"markdown","source":["This data set includes descriptions of hypothetical samples corresponding to 23 species of gilled mushrooms in the Agaricus and Lepiota Family (pp. 500-525). Each species is identified as definitely edible, definitely poisonous, or of unknown edibility and not recommended. This latter class was combined with the poisonous one. The Guide clearly states that there is no simple rule for determining the edibility of a mushroom; no rule like ``leaflets three, let it be'' for Poisonous Oak and Ivy. More details [here](https://archive.ics.uci.edu/ml/datasets/mushroom)."],"metadata":{"id":"-f9daEHdrG5E"}},{"cell_type":"code","source":["!mkdir -p data\n","!cd data && wget -q --show-progress https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data\n","!cd data && wget -q --show-progress https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.names"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"adGWyfxFrHij","executionInfo":{"status":"ok","timestamp":1639145418029,"user_tz":-330,"elapsed":1715,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"eb9c650f-63bc-4fcf-ef24-b1f698d71d4a"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["agaricus-lepiota.da 100%[===================>] 364.95K 1.31MB/s in 0.3s \n","agaricus-lepiota.na 100%[===================>] 6.66K --.-KB/s in 0s \n"]}]},{"cell_type":"markdown","source":["### Preprocessing"],"metadata":{"id":"Aal7wGRfrhfe"}},{"cell_type":"code","source":["mushroom_data = pd.read_csv(\"data/agaricus-lepiota.data\", header=None)\n","\n","column_names = [\"classes\", \"cap-shape\", \"cap-surface\", \"cap-color\", \"bruises?\", \"odor\", \"gill-attachment\",\n"," \"gill-spacing\", \"gill-size\", \"gill-color\", \"stalk-shape\", \"stalk-root\", \"stalk-surface-above-ring\",\n"," \"stalk-surface-below-ring\", \"stalk-color-above-ring\", \"stalk-color-below-ring\", \"veil-type\", \n"," \"veil-color\", \"ring-number\", \"ring-type\", \"spore-print-color\", \"population\", \"habitat\"]\n"," \n","mushroom_data.columns = column_names\n","mushroom_data.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":278},"id":"TshNYFbQrhdi","executionInfo":{"status":"ok","timestamp":1639145489020,"user_tz":-330,"elapsed":516,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"88c714b1-d1c5-4666-8f70-9db8b6fe6584"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","
\n"," \n","
\n","
\n","
classes
\n","
cap-shape
\n","
cap-surface
\n","
cap-color
\n","
bruises?
\n","
odor
\n","
gill-attachment
\n","
gill-spacing
\n","
gill-size
\n","
gill-color
\n","
stalk-shape
\n","
stalk-root
\n","
stalk-surface-above-ring
\n","
stalk-surface-below-ring
\n","
stalk-color-above-ring
\n","
stalk-color-below-ring
\n","
veil-type
\n","
veil-color
\n","
ring-number
\n","
ring-type
\n","
spore-print-color
\n","
population
\n","
habitat
\n","
\n"," \n"," \n","
\n","
0
\n","
p
\n","
x
\n","
s
\n","
n
\n","
t
\n","
p
\n","
f
\n","
c
\n","
n
\n","
k
\n","
e
\n","
e
\n","
s
\n","
s
\n","
w
\n","
w
\n","
p
\n","
w
\n","
o
\n","
p
\n","
k
\n","
s
\n","
u
\n","
\n","
\n","
1
\n","
e
\n","
x
\n","
s
\n","
y
\n","
t
\n","
a
\n","
f
\n","
c
\n","
b
\n","
k
\n","
e
\n","
c
\n","
s
\n","
s
\n","
w
\n","
w
\n","
p
\n","
w
\n","
o
\n","
p
\n","
n
\n","
n
\n","
g
\n","
\n","
\n","
2
\n","
e
\n","
b
\n","
s
\n","
w
\n","
t
\n","
l
\n","
f
\n","
c
\n","
b
\n","
n
\n","
e
\n","
c
\n","
s
\n","
s
\n","
w
\n","
w
\n","
p
\n","
w
\n","
o
\n","
p
\n","
n
\n","
n
\n","
m
\n","
\n","
\n","
3
\n","
p
\n","
x
\n","
y
\n","
w
\n","
t
\n","
p
\n","
f
\n","
c
\n","
n
\n","
n
\n","
e
\n","
e
\n","
s
\n","
s
\n","
w
\n","
w
\n","
p
\n","
w
\n","
o
\n","
p
\n","
k
\n","
s
\n","
u
\n","
\n","
\n","
4
\n","
e
\n","
x
\n","
s
\n","
g
\n","
f
\n","
n
\n","
f
\n","
w
\n","
b
\n","
k
\n","
t
\n","
e
\n","
s
\n","
s
\n","
w
\n","
w
\n","
p
\n","
w
\n","
o
\n","
e
\n","
n
\n","
a
\n","
g
\n","
\n"," \n","
\n","
"],"text/plain":[" classes cap-shape cap-surface ... spore-print-color population habitat\n","0 p x s ... k s u\n","1 e x s ... n n g\n","2 e b s ... n n m\n","3 p x y ... k s u\n","4 e x s ... n a g\n","\n","[5 rows x 23 columns]"]},"metadata":{},"execution_count":3}]},{"cell_type":"code","source":["mushroom_data.dtypes"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"sIbAiLjtrhbZ","executionInfo":{"status":"ok","timestamp":1639145504479,"user_tz":-330,"elapsed":518,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"f0602325-8225-4047-b8a9-503031bba8c4"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["classes object\n","cap-shape object\n","cap-surface object\n","cap-color object\n","bruises? object\n","odor object\n","gill-attachment object\n","gill-spacing object\n","gill-size object\n","gill-color object\n","stalk-shape object\n","stalk-root object\n","stalk-surface-above-ring object\n","stalk-surface-below-ring object\n","stalk-color-above-ring object\n","stalk-color-below-ring object\n","veil-type object\n","veil-color object\n","ring-number object\n","ring-type object\n","spore-print-color object\n","population object\n","habitat object\n","dtype: object"]},"metadata":{},"execution_count":4}]},{"cell_type":"code","source":["# label encoding\n","for column in column_names:\n"," mushroom_data[column] = mushroom_data[column].astype('category')\n"," mushroom_data[column] = mushroom_data[column].cat.codes\n","\n","# split\n","idx_trn, idx_tst = train_test_split(mushroom_data.index, test_size=0.2, random_state=42, \n"," stratify=mushroom_data[['classes']])"],"metadata":{"id":"I420evWNrhZQ"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["gini by factors"],"metadata":{"id":"c6AARTV0sSEw"}},{"cell_type":"code","source":["def gini(var):\n"," df = mushroom_data.copy()\n"," x_trn = df.loc[idx_trn, var]\n"," y_trn = df.loc[idx_trn, 'classes']\n"," x_tst = df.loc[idx_tst, var]\n"," y_tst = df.loc[idx_tst, 'classes']\n"," \n"," if x_trn.dtype in ['O','object']:\n"," cats = pd.DataFrame({'x': x_trn, 'y': y_trn}).fillna('#NAN#').groupby('x').agg('mean').sort_values('y').index.values\n"," X_trn = pd.Categorical(x_trn.fillna('#NAN#'), categories=cats, ordered=True).codes.reshape(-1, 1)\n"," X_tst = pd.Categorical(x_tst.fillna('#NAN#'), categories=cats, ordered=True).codes.reshape(-1, 1)\n"," else:\n"," repl = min(x_trn.min(), x_tst.min())-1 if np.isfinite(min(x_trn.min(), x_tst.min())-1) else -999999\n"," #repl = x_trn.min()-1 if np.isfinite(x_trn.min())-1 else -999999\n"," X_trn = x_trn.fillna(repl).replace(np.inf, repl).replace(-np.inf, repl).values.reshape(-1, 1)\n"," X_tst = x_tst.fillna(repl).replace(np.inf, repl).replace(-np.inf, repl).values.reshape(-1, 1)\n"," \n"," obvious_gini_trn = 2*roc_auc_score(y_trn, X_trn)-1\n"," obvious_gini_tst = 2*roc_auc_score(y_tst, X_tst)-1\n","\n"," if obvious_gini_trn < 0:\n"," obvious_gini_trn = -obvious_gini_trn\n"," obvious_gini_tst = -obvious_gini_tst\n","\n"," parameters = {'min_samples_leaf':[0.01, 0.025, 0.05, 0.1]}\n"," dt = DecisionTreeClassifier(random_state=1)\n"," clf = GridSearchCV(dt, parameters, cv=4, scoring='roc_auc', n_jobs=10)\n"," clf.fit(X_trn, y_trn)\n","\n"," true_gini_trn = 2*clf.best_score_-1\n"," true_gini_tst = 2*roc_auc_score(y_tst, clf.predict_proba(X_tst)[:, 1])-1\n","\n"," if true_gini_trn < 0:\n"," true_gini_trn = -true_gini_trn\n"," true_gini_tst = -true_gini_tst\n","\n"," if obvious_gini_trn > true_gini_trn:\n"," return [var, obvious_gini_trn, obvious_gini_tst]\n"," else:\n"," return [var, true_gini_trn, true_gini_tst]"],"metadata":{"id":"hjgbgx7NrhWv"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["with Pool(20) as p:\n"," vars_gini = list(tqdm(p.imap(gini, column_names), total=len(column_names)))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":49,"referenced_widgets":["2b72cbdd08374942859625d2047795f2","396e4164d325484e9956f597c2e133e0","46ce32b9cbc74045b96fc2fbc93f0575","596798eaeac14aaea8c3cc476b7f329f","c60ea6ae22a2457786ca6b8e3446e3f2","342e5fcfeeb04720834331a4274b5e28","9cbda8d73a0a41f8acb9c3bdacdc7a9b","042addbfa66d4dd4a8543124cc312905","3e9ddf2ca50f4c24bcf276eeeee63d01","ce6fa32eee4044df843b45c5693e065e","5ac6a207b502473fa8bd11d2adcc1201"]},"id":"pwtreallsHVN","executionInfo":{"status":"ok","timestamp":1639145595544,"user_tz":-330,"elapsed":9639,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"d6e113bd-e273-4922-f04d-a4d6448d26b2"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"2b72cbdd08374942859625d2047795f2","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/23 [00:00, ?it/s]"]},"metadata":{}}]},{"cell_type":"code","source":["vars_gini = pd.DataFrame(vars_gini)\n","vars_gini.set_index(0, inplace=True)\n","vars_gini.columns = ['gini_train', 'gini_test']\n","\n","vars_gini.T"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":184},"id":"wqBNXxJVsLoh","executionInfo":{"status":"ok","timestamp":1639145626752,"user_tz":-330,"elapsed":527,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"98514987-c253-42d6-8c63-a7fb38cf9c5a"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","
\n"," \n","
\n","
\n","
classes
\n","
cap-shape
\n","
cap-surface
\n","
cap-color
\n","
bruises?
\n","
odor
\n","
gill-attachment
\n","
gill-spacing
\n","
gill-size
\n","
gill-color
\n","
stalk-shape
\n","
stalk-root
\n","
stalk-surface-above-ring
\n","
stalk-surface-below-ring
\n","
stalk-color-above-ring
\n","
stalk-color-below-ring
\n","
veil-type
\n","
veil-color
\n","
ring-number
\n","
ring-type
\n","
spore-print-color
\n","
population
\n","
habitat
\n","
\n"," \n"," \n","
\n","
gini_train
\n","
1.0
\n","
0.185225
\n","
0.180956
\n","
0.207793
\n","
0.495815
\n","
0.967487
\n","
0.040117
\n","
0.256251
\n","
0.490563
\n","
0.758349
\n","
0.10296
\n","
0.429898
\n","
0.543743
\n","
0.534091
\n","
0.544061
\n","
0.534553
\n","
0.0
\n","
0.045791
\n","
0.114617
\n","
0.627000
\n","
0.761604
\n","
0.519078
\n","
0.444780
\n","
\n","
\n","
gini_test
\n","
1.0
\n","
0.212779
\n","
0.201118
\n","
0.237278
\n","
0.490001
\n","
0.969555
\n","
0.044683
\n","
0.257858
\n","
0.535203
\n","
0.760057
\n","
0.09395
\n","
0.426011
\n","
0.530422
\n","
0.532951
\n","
0.528023
\n","
0.516607
\n","
0.0
\n","
0.054705
\n","
0.117193
\n","
0.622052
\n","
0.746050
\n","
0.510436
\n","
0.476353
\n","
\n"," \n","
\n","
"],"text/plain":["0 classes cap-shape ... population habitat\n","gini_train 1.0 0.185225 ... 0.519078 0.444780\n","gini_test 1.0 0.212779 ... 0.510436 0.476353\n","\n","[2 rows x 23 columns]"]},"metadata":{},"execution_count":8}]},{"cell_type":"markdown","source":["Correlation analysis"],"metadata":{"id":"2CWLsNxLsVYI"}},{"cell_type":"code","source":["vars_corrs = mushroom_data.loc[:, column_names].corr().abs().stack().reset_index().drop_duplicates()\n","vars_corrs = vars_corrs[vars_corrs.level_0!=vars_corrs.level_1]\n","vars_corrs.columns = ['var_1', 'var_2', 'correlation']\n","vars_corrs = vars_corrs.set_index(['var_1', 'var_2'], drop=True).sort_values(by='correlation', ascending=False)\n","\n","vars_drop = []\n","\n","for v in vars_corrs[vars_corrs.correlation > 0.7].index.values:\n"," if v[0] not in vars_drop and v[1] not in vars_drop:\n"," vars_drop.append(v[1] if vars_gini.loc[v[0], 'gini_train'] > vars_gini.loc[v[1], 'gini_train'] else v[0])\n"," \n","del v"],"metadata":{"id":"U94p4ETPscxi"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Feature selection"],"metadata":{"id":"q1MuoCp4sk8r"}},{"cell_type":"code","source":["# all variables\n","vars0 = column_names[1:]\n","\n","# drop values with gini less than 3%\n","vars1 = [v for v in vars0 if vars_gini.loc[v, 'gini_train'] >= 0.03]\n","\n","# drop correlated variables\n","vars2 = [v for v in vars1 if v not in vars_drop]\n","\n","i = 0\n","\n","for var_lst in [vars0, vars1, vars2]:\n"," i += 1\n"," lgb = LGBMClassifier(max_depth=1, n_estimators=250, random_state=42, n_jobs=30)\n"," \n"," cv = cross_validate(lgb, mushroom_data.loc[:, var_lst], mushroom_data.loc[:, 'classes'], \n"," cv=5, scoring='roc_auc', n_jobs=20, return_train_score=True)\n"," \n"," lgb.fit(mushroom_data[var_lst], mushroom_data['classes'])\n"," \n"," print({'Variables': len(var_lst), \n"," 'Train CV': round(cv['train_score'].mean()*2-1, 4), \n"," 'Test CV': round(cv['test_score'].mean()*2-1, 4)})\n"," \n","var_lst_imp = pd.Series(dict(zip(var_lst, lgb.feature_importances_)))\n","var_lst = [i for i in var_lst_imp.index if var_lst_imp.loc[i]>0]\n","print({'exclude': [i for i in var_lst_imp.index if var_lst_imp.loc[i]<=0]})\n","print(len(var_lst))\n","\n","forw_cols = []\n","current_ginis = pd.Series({'Train CV':0, 'Test CV':0})\n","\n","def forw(x):\n"," lgb = LGBMClassifier(max_depth=1, n_estimators=250, random_state=42, n_jobs=1)\n"," cv = cross_validate(lgb, mushroom_data.loc[:, forw_cols+[x]], mushroom_data.loc[:, 'classes'],\n"," cv=5, scoring='roc_auc', n_jobs=1, return_train_score=True)\n"," lgb.fit(mushroom_data.loc[:, forw_cols+[x]], mushroom_data.loc[:, 'classes'])\n"," return x, pd.Series({\n"," 'Train CV': cv['train_score'].mean()*2-1,\n"," 'Test CV': cv['test_score'].mean()*2-1\n"," })\n","\n","forwards_log = []\n","while len(forw_cols)<30:\n"," with Pool(20) as p:\n"," res = list(tqdm(p.imap(forw, [i for i in var_lst if i not in forw_cols]), total=len(var_lst)-len(forw_cols), leave=False))\n"," res = pd.DataFrame({i[0]:i[1] for i in res}).T\n"," delta = res - current_ginis\n"," if delta['Test CV'].max()<0:\n"," break\n"," best_var = delta['Test CV'].idxmax()\n"," forw_cols = forw_cols + [best_var]\n"," current_ginis = res.loc[best_var]\n"," forwards_log.append(current_ginis)\n"," clear_output()\n"," print(pd.DataFrame(forwards_log))\n","\n","clear_output()\n","forwards_log = pd.DataFrame(forwards_log)\n","forwards_log['Uplift Train CV'] = forwards_log['Train CV']-forwards_log['Train CV'].shift(1).fillna(0)\n","forwards_log['Uplift Test CV'] = forwards_log['Test CV']-forwards_log['Test CV'].shift(1).fillna(0)\n","print(forwards_log)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":153,"referenced_widgets":["3d6f8baea53a484faab78b4c50fbf620","9689c9d0d5354f7782671e9b301c5840","4550c6895fa244efb6dd5cbc9dd98324","b70c31ffb8784655ad0d4e59e12343d6","c14978517f8047718a1c084947d702b0","60d54986769b4e859de45bbce659b7f1","0181512ceea0401db61675636ae223b5","4b34f4a343b242abaef58ebe57e07a4d","476d47eec56d4ff0bec2900ed3505ba2","27609bb3e0594b5084e01fae4b04cc9c","606916b9b63b43969a01e84ec142f341","b8cc488f50764d7a80c565e120acf3bd","73139f73ef7d4769807b6dc081a48fb1","8c0a7a56a8d946bf953390fd61675c4d","63ead4d72b27495cac3bb6a385895123","a1d8d9e611534997828fa51cdab2bd0a","afe8ad0a833b4f399a1f6d8367786fd3","c55e9f4461c24c9f88ba2098ff957634","4472bedf87ec41aeb3306d6364386540","edc2a60460ef48bdb78972f403c14175","d971324520f34ce5b3b6994ddd0d0102","6d4282c72b80490cbdb027d3592849ea","77454d4570db40ad9d90ed0f9d80f019","efe993ec7ad34cfaac8ca10da8b06b25","a845d33bdbc048af807e19eb89699a1b","e16dcd3650f64c61b1c53445f96d13d5","124e06ade51442c3af9d364455ec278f","a87b20c55b6547d7bad171519b9c2029","ce8d826cba9f41f8bb33997ceceab3c0","3ad0f66ba72c47ce8537870c6af56c0c","3f68a6b94c614e87aea69a1fecf11d2e","3b3af273314945ef951076ac38deb74c","ffd1831574034bc59136368ad3e60108","d8e841629bac43fbbea7f0a924aa9b94","dcde233fe4804bd8be4a35f7a781a985","a31bcdbac3f54376814d4b9cd40d545b","806b8ca3d7fe4e05b22b038a82eb4545","a26e8dfe75d540208dae3d35a0444551","9a8c2b7f24ad47dea0cc84b99639f151","721da9071ffc493d97a523d2f2ac4f59","0f5ac0bc528b4fa1b8d5a7aafeb36c79","a37b2e9543074546bf43c7741f3a5650","f95e707810f3426eb20134bad69e6a7f","c065af81128d4149b26e71b7a6cb4c14","153549b4beb84e54b5fe4bec2eecf075","d7e2ff7ce49d44588f16e7abfbb9885c","6a821f0913784d64b2e98282b6ae15a1","f736e0b03dea46dea371a5abcbcde9d7","f0f773f30026425fa0dfdcefd1f7d2dc","914c417613a446c28921a6cb430218dc","76e6aa6b457347af8ef3146d3d1e7437","3d87aae69d6149fc98c0b0a642fd9194","4a588c2572094039983c106ffd558d86","346efff4305041a5bd4913a00ebae73a","3a36af3ccfd54942b5e4643c373f60a2","d1538f6f3b7641ccb48e2bbdef414389","3810f04feb094355bdc304447a3356b5","2528ae76b0a7423a8910adf401a5514a","d8d6807eee1e44f78e10dcd5251c3e58","21eac8d36aaf4fa2a0565329dedd965b","411e0eeb49834c04bbca486de6d10b5d","d3282d958c424f84a1b0e2f65dc6602b","28e68ecc22cf450d8ac9b8067ea0f801","310d810b45114471bbc5a6658de789df","9c7bed0810f34fe5948110f9c4ad1894","c8dc39d329de455ea39ec34406e6bd59"]},"id":"WzyBNZ9psmGi","executionInfo":{"status":"ok","timestamp":1639145844301,"user_tz":-330,"elapsed":68523,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"c12cae13-09ca-4583-fa7d-1cb2fe20519f"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":[" Train CV Test CV Uplift Train CV Uplift Test CV\n","odor 0.970307 0.843798 0.970307 0.843798\n","gill-size 0.979971 0.958396 0.009664 0.114598\n","gill-spacing 0.984611 0.964531 0.004640 0.006135\n","stalk-shape 0.993921 0.982878 0.009310 0.018347\n","habitat 0.995208 0.984953 0.001287 0.002075\n"]}]},{"cell_type":"code","source":["ids_vars = forwards_log[forwards_log['Uplift Test CV']>0.001].index.values.tolist()\n","vars_gini.loc[ids_vars,:]"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":238},"id":"jjPfCIG-sw2k","executionInfo":{"status":"ok","timestamp":1639145844304,"user_tz":-330,"elapsed":47,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"9fa96409-314f-4dab-a148-c38601d0e10b"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
"],"text/plain":[" X_1 X_2 X_3 X_4 X_5 a y probs\n","0 6 1 0 0 5 1 1 1\n","1 6 1 0 0 5 0 0 1\n","2 6 1 0 0 5 0 0 1\n","3 6 1 0 0 5 1 -1 1\n","4 0 0 0 0 1 1 1 1"]},"metadata":{},"execution_count":13}]},{"cell_type":"code","source":["with open('data/mushroom_data_final.pickle', 'wb') as handle:\n"," pickle.dump(mushroom_data_final, handle, protocol=pickle.HIGHEST_PROTOCOL)"],"metadata":{"id":"ZTavtFcks9iR"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Utilities"],"metadata":{"id":"p4B8_mndtBlr"}},{"cell_type":"markdown","source":["### Softmax"],"metadata":{"id":"dHg46NSstX9e"}},{"cell_type":"code","source":["def softmax(action_values, tau=1.0):\n"," \"\"\"\n"," Args:\n"," action_values (Numpy array): A 2D array of shape (batch_size, num_actions).\n"," The action-values computed by an action-value network.\n"," tau (float): The temperature parameter scalar.\n"," Returns:\n"," A 2D array of shape (batch_size, num_actions). Where each column is a probability distribution over\n"," the actions representing the policy.\n"," \"\"\"\n","\n"," # Compute the preferences by dividing the action-values by the temperature parameter tau\n"," preferences = action_values / tau\n"," # Compute the maximum preference across the actions\n"," max_preference = np.max(preferences, axis=1)\n","\n"," # your code here\n","\n"," # Reshape max_preference array which has shape [Batch,] to [Batch, 1]. This allows NumPy broadcasting\n"," # when subtracting the maximum preference from the preference of each action.\n"," reshaped_max_preference = max_preference.reshape((-1, 1))\n"," # print(reshaped_max_preference)\n","\n"," # Compute the numerator, i.e., the exponential of the preference - the max preference.\n"," exp_preferences = np.exp(preferences - reshaped_max_preference)\n"," # print(exp_preferences)\n"," # Compute the denominator, i.e., the sum over the numerator along the actions axis.\n"," sum_of_exp_preferences = np.sum(exp_preferences, axis=1)\n"," # print(sum_of_exp_preferences)\n","\n"," # your code here\n","\n"," # Reshape sum_of_exp_preferences array which has shape [Batch,] to [Batch, 1] to allow for NumPy broadcasting\n"," # when dividing the numerator by the denominator.\n"," reshaped_sum_of_exp_preferences = sum_of_exp_preferences.reshape((-1, 1))\n"," # print(reshaped_sum_of_exp_preferences)\n","\n"," # Compute the action probabilities according to the equation in the previous cell.\n"," action_probs = exp_preferences / reshaped_sum_of_exp_preferences\n"," # print(action_probs)\n","\n"," # your code here\n","\n"," # squeeze() removes any singleton dimensions. It is used here because this function is used in the\n"," # agent policy when selecting an action (for which the batch dimension is 1.) As np.random.choice is used in\n"," # the agent policy and it expects 1D arrays, we need to remove this singleton batch dimension.\n"," action_probs = action_probs.squeeze()\n"," return action_probs"],"metadata":{"id":"utuZpkQktdjN"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","# rand_generator = np.random.RandomState(0)\n","# action_values = rand_generator.normal(0, 1, (2, 4))\n","# tau = 0.5\n","\n","# action_probs = softmax(action_values, tau)\n","# print(\"action_probs\", action_probs)\n","\n","# assert (np.allclose(action_probs, np.array([\n","# [0.25849645, 0.01689625, 0.05374514, 0.67086216],\n","# [0.84699852, 0.00286345, 0.13520063, 0.01493741]\n","# ])))\n","\n","# action_values = np.array([[0.0327, 0.0127, 0.0688]])\n","# tau = 1.\n","# action_probs = softmax(action_values, tau)\n","# print(\"action_probs\", action_probs)\n","\n","# assert np.allclose(action_probs, np.array([0.3315, 0.3249, 0.3436]), atol=1e-04)\n","\n","# print(\"Passed the asserts! (Note: These are however limited in scope, additional testing is encouraged.)\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Mbk-YyyHtfqc","executionInfo":{"status":"ok","timestamp":1639145939697,"user_tz":-330,"elapsed":477,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"c0665afb-a0c1-460c-e4d7-7d9e20103146"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["action_probs [[0.25849645 0.01689625 0.05374514 0.67086216]\n"," [0.84699852 0.00286345 0.13520063 0.01493741]]\n","action_probs [0.33145968 0.32489634 0.34364398]\n","Passed the asserts! (Note: These are however limited in scope, additional testing is encouraged.)\n"]}]},{"cell_type":"markdown","source":["### Replay buffer"],"metadata":{"id":"CsJuwC4nth4A"}},{"cell_type":"code","source":["class ReplayBuffer:\n"," def __init__(self, size, seed):\n"," \"\"\"\n"," Args:\n"," size (integer): The size of the replay buffer.\n"," minibatch_size (integer): The sample size.\n"," seed (integer): The seed for the random number generator.\n"," \"\"\"\n"," self.buffer = []\n"," self.rand_generator = np.random.RandomState(seed)\n"," self.max_size = size\n","\n"," def append(self, state, action, reward):\n"," \"\"\"\n"," Args:\n"," state (Numpy array): The state.\n"," action (integer): The action.\n"," reward (float): The reward.\n"," terminal (integer): 1 if the next state is a terminal state and 0 otherwise.\n"," next_state (Numpy array): The next state.\n"," \"\"\"\n"," if len(self.buffer) == self.max_size:\n"," del self.buffer[0]\n"," self.buffer.append([state, action, reward])\n","\n"," def sample(self, last_action):\n"," \"\"\"\n"," Returns:\n"," A list of transition tuples including state, action, reward, terinal, and next_state\n"," \"\"\"\n"," state, action, reward = map(list, zip(*self.buffer))\n"," idxs = [elem == last_action for elem in action]\n"," X = [b for a, b in zip(idxs, state) if a]\n"," y = [b for a, b in zip(idxs, reward) if a]\n","\n"," return X, y\n","\n"," def size(self):\n"," return len(self.buffer)"],"metadata":{"id":"mPZIB5GOtm7D"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == \"__main__\":\n","\n","# buffer = ReplayBuffer(size=100000, seed=1)\n","# buffer.append([1, 2, 3], 0, 1)\n","# buffer.append([4, 21, 3], 1, 1)\n","# buffer.append([0, 1, 1], 0, 0)\n","\n","# print(buffer.sample(0))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"XCsLBOzDtozO","executionInfo":{"status":"ok","timestamp":1639145971783,"user_tz":-330,"elapsed":9,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"fbd79fdd-1c19-4e74-ce5d-77d8b66a834c"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["([[1, 2, 3], [0, 1, 1]], [1, 0])\n"]}]},{"cell_type":"markdown","source":["### Data Generator"],"metadata":{"id":"MGlV70x3tpu7"}},{"cell_type":"code","source":["def generate_samples(num_samples, num_features, num_arms, return_dataframe=False):\n"," np.random.seed(1)\n"," # generate pseudo features X and \"true\" arms' weights\n"," X = np.random.randint(0, 4, size=(num_samples, num_features))\n"," actions_weights = np.random.normal(loc=-1., scale=1, size=(num_arms, num_features))\n","\n"," # apply data generating policy\n"," policy_weights = np.random.normal(size=(num_arms, num_features))\n"," action_scores = np.dot(X, policy_weights.T)\n"," action_probs = softmax(action_scores, tau=10)\n"," A = np.zeros((num_samples, 1))\n"," for i in range(num_samples):\n"," A[i, 0] = np.random.choice(range(num_arms), 1, p=action_probs[i, :])\n","\n"," # store probabilities of choosing a particular action\n"," _rows = np.zeros_like(A, dtype=np.intp)\n"," _columns = A.astype(int)\n"," probs = action_probs[_rows, _columns]\n","\n"," # calculate \"true\" outcomes Y\n"," ## broadcasting chosen actions to action weights\n"," matrix_multiplicator = actions_weights[_columns].squeeze() # (num_samples x num_features) matrix\n"," rewards = np.sum(X * matrix_multiplicator, axis=1).reshape(-1, 1)\n"," Y = (np.sign(rewards) + 1) / 2\n","\n"," if return_dataframe:\n"," column_names = ['X_' + str(i+1) for i in range(num_features)]\n"," X = pd.DataFrame(X, columns=column_names)\n"," A = pd.DataFrame(A, columns=['a'])\n"," Y = pd.DataFrame(Y, columns=['y'])\n"," probs = pd.DataFrame(probs, columns=['probs'])\n","\n"," return pd.concat([X, A, Y, probs], axis=1)\n"," else:\n"," return X, A, Y, probs"],"metadata":{"id":"2bxVP6RGtxDa"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# dataset = generate_samples(100000, 4, 3, True)\n","# dataset.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"UH5mKo3htyWH","executionInfo":{"status":"ok","timestamp":1639146016409,"user_tz":-330,"elapsed":4932,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"fca14966-0540-4ed6-e390-3ad54fb80465"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","
\n"," \n","
\n","
\n","
X_1
\n","
X_2
\n","
X_3
\n","
X_4
\n","
a
\n","
y
\n","
probs
\n","
\n"," \n"," \n","
\n","
0
\n","
1
\n","
3
\n","
0
\n","
0
\n","
0.0
\n","
0.0
\n","
0.266661
\n","
\n","
\n","
1
\n","
3
\n","
1
\n","
3
\n","
1
\n","
1.0
\n","
0.0
\n","
0.236514
\n","
\n","
\n","
2
\n","
3
\n","
0
\n","
0
\n","
1
\n","
1.0
\n","
0.0
\n","
0.236514
\n","
\n","
\n","
3
\n","
0
\n","
3
\n","
1
\n","
0
\n","
1.0
\n","
0.0
\n","
0.236514
\n","
\n","
\n","
4
\n","
2
\n","
1
\n","
2
\n","
0
\n","
0.0
\n","
0.0
\n","
0.266661
\n","
\n"," \n","
\n","
"],"text/plain":[" X_1 X_2 X_3 X_4 a y probs\n","0 1 3 0 0 0.0 0.0 0.266661\n","1 3 1 3 1 1.0 0.0 0.236514\n","2 3 0 0 1 1.0 0.0 0.236514\n","3 0 3 1 0 1.0 0.0 0.236514\n","4 2 1 2 0 0.0 0.0 0.266661"]},"metadata":{},"execution_count":20}]},{"cell_type":"markdown","source":["### Data loader"],"metadata":{"id":"PYr5NIxatzVv"}},{"cell_type":"code","source":["def data_randomizer(pickle_file, seed=None):\n"," if isinstance(pickle_file, str):\n"," with open(pickle_file, 'rb') as f:\n"," dataset = pickle.load(f)\n"," else:\n"," dataset = pickle_file\n","\n"," actions = sorted(dataset.iloc[:, -3].unique().tolist())\n"," tst_smpl = pd.DataFrame().reindex_like(dataset).dropna()\n"," ratio = 0.1\n","\n"," for action in actions:\n"," action_subsample = dataset[dataset.iloc[:, -3] == action]\n"," action_drop, action_use = train_test_split(action_subsample.index, test_size=ratio,\n"," random_state=seed,\n"," stratify=action_subsample.iloc[:, -2])\n"," tst_smpl = pd.concat([tst_smpl,\n"," action_subsample.loc[action_use]]).sample(frac=1, random_state=seed)\n","\n"," tst_smpl = tst_smpl.reset_index(drop=True)\n","\n"," del action_drop, action_use\n","\n"," X = tst_smpl.iloc[:, :-3].to_numpy()\n"," A = tst_smpl.iloc[:, -3].to_numpy()\n"," Y = tst_smpl.iloc[:, -2].to_numpy()\n"," probs = tst_smpl.iloc[:, -1].to_numpy()\n","\n"," return X, A, Y/probs"],"metadata":{"id":"3sW2YJahuCbl"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["class BanditDataset(Dataset):\n"," def __init__(self, pickle_file, seed=None):\n"," # load dataset\n"," X, A, Y = data_randomizer(pickle_file, seed)\n"," self.features = X\n"," self.actions = A\n"," self.rewards = Y\n","\n"," def __len__(self):\n"," return len(self.rewards)\n","\n"," def __getitem__(self, idx):\n"," feature_vec = self.features[idx]\n"," action = self.actions[idx]\n"," reward = self.rewards[idx]\n","\n"," return feature_vec, action, reward"],"metadata":{"id":"NcdcUSeruEUD"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","# dir = 'data/mushroom_data_final.pickle'\n","# data = data_randomizer(dir)\n","\n","# dataset = BanditDataset(pickle_file=dir, seed=1)\n","# print(len(dataset))\n","# print(dataset.__len__())\n","# print(dataset[420])\n","# print(dataset[421])\n","# print(dataset[0])\n","# print(dataset[1])\n","\n","# dl = DataLoader(dataset, batch_size=2, shuffle=True)\n","\n","# print(next(iter(dl)))\n","\n","# dataset = generate_samples(100000, 4, 3, True)\n","# dataset = BanditDataset(pickle_file=dataset, seed=1)\n","# print(len(dataset))\n","# print(dataset.__len__())\n","# print(dataset[420])\n","# print(dataset[421])\n","# print(dataset[0])\n","# print(dataset[1])"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"8v7s0-QIuGPR","executionInfo":{"status":"ok","timestamp":1639146132864,"user_tz":-330,"elapsed":5534,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"dada2526-7ef3-476c-e6f7-141d7f62e7c0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["3251\n","3251\n","(array([5., 0., 0., 1., 0.]), 1.0, 1.0)\n","(array([7., 1., 0., 1., 0.]), 0.0, 0.0)\n","(array([3., 0., 0., 0., 1.]), 0.0, 0.0)\n","(array([7., 1., 0., 1., 0.]), 1.0, 1.0)\n","[tensor([[5., 0., 0., 1., 0.],\n"," [5., 0., 1., 1., 1.]], dtype=torch.float64), tensor([0., 0.], dtype=torch.float64), tensor([0., 0.], dtype=torch.float64)]\n","10001\n","10001\n","(array([1., 1., 1., 1.]), 2.0, 0.0)\n","(array([1., 3., 3., 3.]), 2.0, 0.0)\n","(array([3., 3., 0., 3.]), 2.0, 0.0)\n","(array([2., 1., 0., 1.]), 1.0, 0.0)\n"]}]},{"cell_type":"markdown","source":["### Plot script"],"metadata":{"id":"IsZ9fTsiuPwc"}},{"cell_type":"code","source":["def get_leveled_data(arr):\n"," \"\"\"\n"," Args:\n"," arr: list of lists os different length\n"," Returns:\n"," average result over arr, axis=0\n"," \"\"\"\n"," b = np.zeros([len(arr), len(max(arr, key=lambda x: len(x)))])\n"," b[:, :] = np.nan\n"," for i, j in enumerate(arr):\n"," b[i][0:len(j)] = j\n","\n"," return b"],"metadata":{"id":"Whuf3fm3uUdS"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def smooth(data, k):\n"," num_episodes = data.shape[1]\n"," num_runs = data.shape[0]\n","\n"," smoothed_data = np.zeros((num_runs, num_episodes))\n","\n"," for i in range(num_episodes):\n"," if i < k:\n"," smoothed_data[:, i] = np.mean(data[:, :i + 1], axis=1)\n"," else:\n"," smoothed_data[:, i] = np.mean(data[:, i - k:i + 1], axis=1)\n","\n"," return smoothed_data"],"metadata":{"id":"eDcvasCOubnj"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def plot_result(result_batch, result_online, batch_size):\n"," plt_agent_sweeps = []\n"," num_steps = np.inf\n","\n"," fig, ax = plt.subplots(figsize=(8, 6))\n","\n"," for data, label in zip([result_batch, result_online], ['batch', 'online']):\n"," sum_reward_data = get_leveled_data(data)\n","\n"," # smooth data\n"," smoothed_sum_reward = smooth(data=sum_reward_data, k=100)\n","\n"," mean_smoothed_sum_reward = np.mean(smoothed_sum_reward, axis=0)\n","\n"," if mean_smoothed_sum_reward.shape[0] < num_steps:\n"," num_steps = mean_smoothed_sum_reward.shape[0]\n","\n"," plot_x_range = np.arange(0, mean_smoothed_sum_reward.shape[0])\n"," graph_current_agent_sum_reward, = ax.plot(plot_x_range, mean_smoothed_sum_reward[:],\n"," label=label)\n"," plt_agent_sweeps.append(graph_current_agent_sum_reward)\n","\n","\n"," update_points = np.ceil(np.arange(num_steps) / batch_size).astype(int)\n"," ax.plot(plot_x_range, mean_smoothed_sum_reward[update_points], label='upper bound')\n","\n"," ax.legend(handles=plt_agent_sweeps, fontsize=13)\n"," ax.set_title(\"Learning Curve\", fontsize=15)\n"," ax.set_xlabel('Episodes', fontsize=14)\n"," ax.set_ylabel('reward', rotation=0, labelpad=40, fontsize=14)\n"," # ax.set_ylim([-300, 300])\n","\n"," plt.tight_layout()\n"," plt.show()"],"metadata":{"id":"6DI-dp6fuawY"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Agents"],"metadata":{"id":"ndaq3Ha6ucgA"}},{"cell_type":"markdown","source":["### Base Agent"],"metadata":{"id":"nK6ccVZfukKl"}},{"cell_type":"markdown","source":["An abstract class that specifies the Agent API for RL-Glue-py."],"metadata":{"id":"5vxRMmXluqMk"}},{"cell_type":"code","source":["class BaseAgent:\n"," \"\"\"Implements the agent for an RL-Glue environment.\n"," Note:\n"," agent_init, agent_start, agent_step, agent_end, agent_cleanup, and\n"," agent_message are required methods.\n"," \"\"\"\n","\n"," __metaclass__ = ABCMeta\n","\n"," def __init__(self):\n"," pass\n","\n"," @abstractmethod\n"," def agent_init(self, agent_info={}):\n"," \"\"\"Setup for the agent called when the experiment first starts.\"\"\"\n","\n"," @abstractmethod\n"," def agent_start(self, observation):\n"," \"\"\"The first method called when the experiment starts, called after\n"," the environment starts.\n"," Args:\n"," observation (Numpy array): the state observation from the environment's evn_start function.\n"," Returns:\n"," The first action the agent takes.\n"," \"\"\"\n","\n"," @abstractmethod\n"," def agent_step(self, reward, observation):\n"," \"\"\"A step taken by the agent.\n"," Args:\n"," reward (float): the reward received for taking the last action taken\n"," observation (Numpy array): the state observation from the\n"," environment's step based, where the agent ended up after the\n"," last step\n"," Returns:\n"," The action the agent is taking.\n"," \"\"\"\n","\n"," @abstractmethod\n"," def agent_end(self, reward):\n"," \"\"\"Run when the agent terminates.\n"," Args:\n"," reward (float): the reward the agent received for entering the terminal state.\n"," \"\"\"\n","\n"," @abstractmethod\n"," def agent_cleanup(self):\n"," \"\"\"Cleanup done after the agent ends.\"\"\"\n","\n"," @abstractmethod\n"," def agent_message(self, message):\n"," \"\"\"A function used to pass information from the agent to the experiment.\n"," Args:\n"," message: The message passed to the agent.\n"," Returns:\n"," The response (or answer) to the message.\n"," \"\"\""],"metadata":{"id":"tIP4FINouoP1"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Random Agent"],"metadata":{"id":"aJdhotjJuyCg"}},{"cell_type":"code","source":["class RandomAgent(BaseAgent):\n"," def __init__(self):\n"," super().__init__()\n"," self.num_actions = None\n","\n"," def agent_init(self, agent_info=None):\n"," if agent_info is None:\n"," agent_info = {}\n"," self.num_actions = agent_info.get('num_actions', 2)\n","\n"," def agent_start(self, observation):\n"," pass\n","\n"," def agent_step(self, reward, observation):\n"," pass\n","\n"," def agent_end(self, reward):\n"," pass\n","\n"," def agent_cleanup(self):\n"," pass\n","\n"," def agent_message(self, message):\n"," pass\n","\n"," def agent_policy(self, observation):\n"," return np.random.choice(self.num_actions)"],"metadata":{"id":"_nofgAnQu3em"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","# ag = RandomAgent()\n","# print(ag.num_actions)\n","\n","# ag.agent_init()\n","# print(ag.num_actions)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"HwKhrIoVu5M3","executionInfo":{"status":"ok","timestamp":1639146301441,"user_tz":-330,"elapsed":6,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"57147a1f-d407-49ad-8e62-4d6c9d90922e"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["None\n","2\n"]}]},{"cell_type":"code","source":["class Agent(BaseAgent):\n"," \"\"\"agent does *no* learning, selects random action always\"\"\"\n","\n"," def __init__(self):\n"," super().__init__()\n"," self.arm_count = None\n"," self.last_action = None\n"," self.num_actions = None\n"," self.q_values = None\n"," self.step_size = None\n"," self.initial_value = 0.0\n"," self.batch_size = None\n"," self.q_values_oracle = None # used for batch updates\n","\n"," def agent_init(self, agent_info=None):\n"," \"\"\"Setup for the agent called when the experiment first starts.\"\"\"\n","\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," self.num_actions = agent_info.get(\"num_actions\", 2)\n"," self.initial_value = agent_info.get(\"initial_value\", 0.0)\n"," self.q_values = np.ones(agent_info.get(\"num_actions\", 2)) * self.initial_value\n"," self.step_size = agent_info.get(\"step_size\", 0.1)\n"," self.batch_size = agent_info.get('batch_size', 1)\n"," self.q_values_oracle = self.q_values.copy()\n"," self.arm_count = np.zeros(self.num_actions) # [0.0 for _ in range(self.num_actions)]\n"," # self.last_action = np.random.choice(self.num_actions) # set first action to random\n","\n"," def agent_start(self, observation):\n"," \"\"\"The first method called when the experiment starts, called after\n"," the environment starts.\n"," Args:\n"," observation (Numpy array): the state observation from the\n"," environment's evn_start function.\n"," Returns:\n"," The first action the agent takes.\n"," \"\"\"\n"," self.last_action = np.random.choice(self.num_actions)\n","\n"," return self.last_action\n","\n"," def agent_step(self, reward, observation):\n"," \"\"\"A step taken by the agent.\n"," Args:\n"," reward (float): the reward received for taking the last action taken\n"," observation (Numpy array): the state observation from the\n"," environment's step based, where the agent ended up after the\n"," last step\n"," Returns:\n"," The action the agent is taking.\n"," \"\"\"\n"," # local_action = 0 # choose the action here\n"," self.last_action = np.random.choice(self.num_actions)\n","\n"," return self.last_action\n","\n"," def agent_end(self, reward):\n"," pass\n","\n"," def agent_cleanup(self):\n"," pass\n","\n"," def agent_message(self, message):\n"," pass"],"metadata":{"id":"egiYidMHvP7D"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def argmax(q_values):\n"," \"\"\"\n"," Takes in a list of q_values and returns the index of the item\n"," with the highest value. Breaks ties randomly.\n"," returns: int - the index of the highest value in q_values\n"," \"\"\"\n"," top_value = float(\"-inf\")\n"," ties = []\n","\n"," for i in range(len(q_values)):\n"," if q_values[i] > top_value:\n"," ties = [i]\n"," top_value = q_values[i]\n"," elif q_values[i] == top_value:\n"," ties.append(i)\n","\n"," return np.random.choice(ties)"],"metadata":{"id":"5w620FFCvTu8"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Greedy Agent"],"metadata":{"id":"F_7QyQIsvraK"}},{"cell_type":"code","source":["class GreedyAgent(Agent):\n"," def __init__(self):\n"," super().__init__()\n","\n"," def agent_init(self, agent_info=None):\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," super().agent_init(agent_info)\n","\n"," def agent_step(self, reward, observation):\n"," \"\"\"\n"," Takes one step for the agent. It takes in a reward and observation and\n"," returns the action the agent chooses at that time step.\n"," Arguments:\n"," reward -- float, the reward the agent received from the environment after taking the last action.\n"," observation -- float, the observed state the agent is in. Do not worry about this as you will not use it\n"," until future lessons\n"," Returns:\n"," current_action -- int, the action chosen by the agent at the current time step.\n"," \"\"\"\n","\n"," a = self.last_action\n"," self.arm_count[a] += 1\n"," self.q_values_oracle[a] = self.q_values_oracle[a] + 1 / self.arm_count[a] * (reward - self.q_values_oracle[a])\n","\n"," if sum(self.arm_count) % self.batch_size == 0:\n"," self.q_values = self.q_values_oracle.copy()\n","\n"," current_action = argmax(self.q_values)\n"," self.last_action = current_action\n","\n"," return current_action"],"metadata":{"id":"my_xM4bpvVDf"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### ϵ-Greedy Agent"],"metadata":{"id":"6SzDe38oviFg"}},{"cell_type":"code","source":["class EpsilonGreedyAgent(Agent):\n"," def __init__(self):\n"," super().__init__()\n"," self.epsilon = None\n","\n"," def agent_init(self, agent_info=None):\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," super().agent_init(agent_info)\n"," self.epsilon = agent_info.get(\"epsilon\", 0.1)\n","\n"," def agent_step(self, reward, observation):\n"," \"\"\"\n"," Takes one step for the agent. It takes in a reward and observation and\n"," returns the action the agent chooses at that time step.\n"," Arguments:\n"," reward -- float, the reward the agent received from the environment after taking the last action.\n"," observation -- float, the observed state the agent is in. Do not worry about this as you will not use it\n"," until future lessons\n"," Returns:\n"," current_action -- int, the action chosen by the agent at the current time step.\n"," \"\"\"\n","\n"," a = self.last_action\n","\n"," self.arm_count[a] += 1\n"," self.q_values_oracle[a] = self.q_values_oracle[a] + 1 / self.arm_count[a] * (reward - self.q_values_oracle[a])\n","\n"," if np.sum(self.arm_count) % self.batch_size == 0:\n"," self.q_values = self.q_values_oracle.copy()\n","\n"," if np.random.random() < self.epsilon:\n"," current_action = np.random.choice(range(len(self.arm_count)))\n"," else:\n"," current_action = argmax(self.q_values)\n","\n"," self.last_action = current_action\n","\n"," return current_action"],"metadata":{"id":"bPTYzIzTvWYZ"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### UCB Agent"],"metadata":{"id":"Y635PDE6vgdI"}},{"cell_type":"code","source":["class UCBAgent(Agent):\n"," def __init__(self):\n"," super().__init__()\n"," self.upper_bounds = None\n"," self.alpha = None # exploration parameter\n","\n"," def agent_init(self, agent_info=None):\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," super().agent_init(agent_info)\n"," self.alpha = agent_info.get(\"alpha\", 1.0)\n"," self.arm_count = np.ones(self.num_actions)\n"," self.upper_bounds = np.sqrt(np.log(np.sum(self.arm_count)) / self.arm_count)\n","\n"," def agent_step(self, reward, observation):\n"," a = self.last_action\n","\n"," self.arm_count[a] += 1\n"," self.q_values_oracle[a] = self.q_values_oracle[a] + 1 / self.arm_count[a] * (reward - self.q_values_oracle[a])\n","\n"," # since we start with arms_count = np.ones(num_actions),\n"," # we should subtract num_actions to get number of the current round\n"," if (np.sum(self.arm_count) - self.num_actions) % self.batch_size == 0:\n"," self.q_values = self.q_values_oracle.copy()\n"," self.upper_bounds = np.sqrt(np.log(np.sum(self.arm_count)) / self.arm_count)\n","\n"," # if min(self.q_values + self.alpha * self.upper_bounds) < max(self.q_values):\n"," # print(f'Distinguish suboptimal arm at step {sum(self.arm_count)}')\n"," current_action = argmax(self.q_values + self.alpha * self.upper_bounds)\n"," # current_action = np.argmax(self.q_values + self.alpha * self.upper_bounds)\n","\n"," self.last_action = current_action\n","\n"," return current_action"],"metadata":{"id":"PV_TaTk1vX0T"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### TS Agent"],"metadata":{"id":"UiTTsyhFvdwc"}},{"cell_type":"code","source":["class TSAgent(Agent):\n"," def agent_step(self, reward, observation):\n"," a = self.last_action\n"," self.arm_count[a] += 1\n"," self.q_values_oracle[a] = self.q_values_oracle[a] + 1 / self.arm_count[a] * (reward - self.q_values_oracle[a])\n","\n"," if (np.sum(self.arm_count) - self.num_actions) % self.batch_size == 0:\n"," self.q_values = self.q_values_oracle.copy()\n","\n"," # sample from posteriors\n"," theta = [beta.rvs(a + 1, b + 1, size=1) for a, b in\n"," zip(self.q_values * self.arm_count, self.arm_count - self.q_values * self.arm_count)]\n"," # choose the max realization\n"," current_action = argmax(theta)\n"," self.last_action = current_action\n","\n"," return current_action"],"metadata":{"id":"TT3oZeNavY4e"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### LinUCB Agent"],"metadata":{"id":"-IL38-vIzIG1"}},{"cell_type":"code","source":["class LinUCBAgent(BaseAgent):\n","\n"," def __init__(self):\n"," super().__init__()\n"," self.name = \"LinUCB\"\n","\n"," def agent_init(self, agent_info=None):\n","\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," self.num_actions = agent_info.get('num_actions', 3)\n"," self.alpha = agent_info.get('alpha', 1)\n"," self.batch_size = agent_info.get('batch_size', 1)\n"," # Set random seed for policy for each run\n"," self.policy_rand_generator = np.random.RandomState(agent_info.get(\"seed\", None))\n","\n"," self.last_action = None\n"," self.last_state = None\n"," self.num_round = None\n","\n"," def agent_policy(self, observation):\n"," p_t = np.zeros(self.num_actions)\n","\n"," for i in range(self.num_actions):\n"," # initialize theta hat\n"," self.theta = inv(self.A[i]).dot(self.b[i])\n"," # get context of each arm from flattened vector of length 100\n"," cntx = observation\n"," # get gain reward of each arm\n"," p_t[i] = self.theta.T.dot(cntx) + self.alpha * np.sqrt(np.maximum(cntx.dot(inv(self.A[i]).dot(cntx)), 0))\n"," # action = np.random.choice(np.where(p_t == max(p_t))[0])\n"," action = self.policy_rand_generator.choice(np.where(p_t == max(p_t))[0])\n","\n"," return action\n","\n"," def agent_start(self, observation):\n"," # Specify feature dimension\n"," self.ndims = len(observation)\n","\n"," self.A = np.zeros((self.num_actions, self.ndims, self.ndims))\n"," # Instantiate b as a 0 vector of length ndims.\n"," self.b = np.zeros((self.num_actions, self.ndims, 1))\n"," # set each A per arm as identity matrix of size ndims\n"," for arm in range(self.num_actions):\n"," self.A[arm] = np.eye(self.ndims)\n","\n"," self.A_oracle = self.A.copy()\n"," self.b_oracle = self.b.copy()\n","\n"," self.last_state = observation\n"," self.last_action = self.agent_policy(self.last_state)\n"," self.num_round = 0\n","\n"," return self.last_action\n","\n"," def agent_update(self, reward):\n"," self.A_oracle[self.last_action] = self.A_oracle[self.last_action] + np.outer(self.last_state, self.last_state)\n"," self.b_oracle[self.last_action] = np.add(self.b_oracle[self.last_action].T, self.last_state * reward).reshape(self.ndims, 1)\n","\n"," def agent_step(self, reward, observation):\n"," if reward is not None:\n"," self.agent_update(reward)\n"," # it is a good question whether I should increment num_round outside\n"," # condition or not (since theoretical result doesn't clarify this\n"," self.num_round += 1\n","\n"," if self.num_round % self.batch_size == 0:\n"," self.A = self.A_oracle.copy()\n"," self.b = self.b_oracle.copy()\n","\n"," self.last_state = observation\n"," self.last_action = self.agent_policy(self.last_state)\n","\n"," return self.last_action\n","\n"," def agent_end(self, reward):\n"," if reward is not None:\n"," self.agent_update(reward)\n"," self.num_round += 1\n","\n"," if self.num_round % self.batch_size == 0:\n"," self.A = self.A_oracle.copy()\n"," self.b = self.b_oracle.copy()\n","\n"," def agent_message(self, message):\n"," pass\n","\n"," def agent_cleanup(self):\n"," pass"],"metadata":{"id":"gyXQwM2-zKR_"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","# agent_info = {'alpha': 2,\n","# 'num_actions': 4,\n","# 'seed': 1}\n","\n","# # check initialization\n","# linucb = LinUCBAgent()\n","# linucb.agent_init(agent_info)\n","# print(linucb.num_actions, linucb.alpha)\n","\n","# assert linucb.num_actions == 4\n","# assert linucb.alpha == 2\n","\n","# # check policy\n","# observation = np.array([1, 2, 5, 0])\n","# linucb.A = np.zeros((linucb.num_actions, len(observation), len(observation)))\n","# # Instantiate b as a 0 vector of length ndims.\n","# linucb.b = np.zeros((linucb.num_actions, len(observation), 1))\n","# # set each A per arm as identity matrix of size ndims\n","# for arm in range(linucb.num_actions):\n","# linucb.A[arm] = np.eye(len(observation))\n","\n","# action = linucb.agent_policy(observation)\n","# print(action)\n","\n","# assert action == 1\n","\n","# # check start\n","# observation = np.array([1, 2, 5, 0])\n","# linucb.agent_start(observation)\n","# print(linucb.ndims)\n","# print(linucb.last_state, linucb.last_action)\n","\n","# assert linucb.ndims == len(observation)\n","# assert np.allclose(linucb.last_state, observation)\n","# assert np.allclose(linucb.b, np.zeros((linucb.num_actions, len(observation), 1)))\n","# assert np.allclose(linucb.A, np.array([np.eye(len(observation)), np.eye(len(observation)),\n","# np.eye(len(observation)), np.eye(len(observation))]))\n","# assert linucb.last_action == 3\n","\n","# # check step\n","# observation = np.array([5, 3, 1, 2])\n","# reward = 1\n","\n","# action = linucb.agent_step(reward, observation)\n","# print(linucb.A)\n","# print(linucb.b)\n","# print(action)\n","\n","# true_A = np.array([[2., 2., 5., 0.],\n","# [2., 5., 10., 0.],\n","# [5., 10., 26., 0.],\n","# [0., 0., 0., 1.]])\n","\n","# true_b = np.array([[1.],\n","# [2.],\n","# [5.],\n","# [0.]])\n","\n","# for i in range(3):\n","# assert np.allclose(linucb.A[i], np.eye(4))\n","# assert np.allclose(linucb.b[i], np.zeros((linucb.num_actions, 4, 1)))\n","# assert np.allclose(linucb.A[3], true_A)\n","# assert np.allclose(linucb.b[3], true_b)\n","# assert linucb.last_action == 0\n","\n","# observation = np.array([3, 1, 3, 5])\n","# reward = None\n","\n","# action = linucb.agent_step(reward, observation)\n","# print(linucb.A)\n","# print(linucb.b)\n","# print(action)\n","\n","# assert np.allclose(linucb.A[3], true_A)\n","# assert np.allclose(linucb.b[3], true_b)\n","# assert action == 0\n","\n","# # check batch size\n","# agent_info = {'alpha': 2,\n","# 'num_actions': 4,\n","# 'seed': 1,\n","# 'batch_size': 2}\n","# linucb = LinUCBAgent()\n","# linucb.agent_init(agent_info)\n","# observation = np.array([1, 2, 5, 0])\n","# linucb.agent_start(observation)\n","# assert linucb.num_round == 0\n","# assert linucb.last_action == 1\n","\n","# observation = np.array([5, 3, 1, 2])\n","# reward = 1\n","\n","# action = linucb.agent_step(reward, observation)\n","# assert linucb.num_round == 1\n","# assert np.allclose(linucb.b, np.zeros((linucb.num_actions, len(observation), 1)))\n","# assert np.allclose(linucb.A, np.array([np.eye(len(observation)), np.eye(len(observation)),\n","# np.eye(len(observation)), np.eye(len(observation))]))\n","\n","# for i in [0, 2, 3]:\n","# assert np.allclose(linucb.A_oracle[i], np.eye(4))\n","# assert np.allclose(linucb.b_oracle[i], np.zeros((linucb.num_actions, 4, 1)))\n","# assert np.allclose(linucb.A_oracle[1], true_A)\n","# assert np.allclose(linucb.b_oracle[1], true_b)\n","\n","# observation = np.array([3, 1, 3, 5])\n","# reward = None\n","# action = linucb.agent_step(reward, observation)\n","# # sinse reward is None, nothing should happen\n","# assert linucb.num_round == 1\n","# assert np.allclose(linucb.b, np.zeros((linucb.num_actions, len(observation), 1)))\n","# assert np.allclose(linucb.A, np.array([np.eye(len(observation)), np.eye(len(observation)),\n","# np.eye(len(observation)), np.eye(len(observation))]))\n","\n","# for i in [0, 2, 3]:\n","# assert np.allclose(linucb.A_oracle[i], np.eye(4))\n","# assert np.allclose(linucb.b_oracle[i], np.zeros((linucb.num_actions, 4, 1)))\n","# assert np.allclose(linucb.A_oracle[1], true_A)\n","# assert np.allclose(linucb.b_oracle[1], true_b)\n","\n","# observation = np.array([3, 0, 2, 5])\n","# reward = 0\n","# action = linucb.agent_step(reward, observation)\n","\n","# assert linucb.num_round == 2\n","# assert np.allclose(linucb.b, linucb.b_oracle)\n","# assert np.allclose(linucb.A, linucb.A_oracle)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Nkdq0ya9zNlE","executionInfo":{"status":"ok","timestamp":1639148410291,"user_tz":-330,"elapsed":5,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"b7a9b9c5-e3d1-4fc8-bdc5-321172c6ebdb"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["4 2\n","1\n","4\n","[1 2 5 0] 3\n","[[[ 1. 0. 0. 0.]\n"," [ 0. 1. 0. 0.]\n"," [ 0. 0. 1. 0.]\n"," [ 0. 0. 0. 1.]]\n","\n"," [[ 1. 0. 0. 0.]\n"," [ 0. 1. 0. 0.]\n"," [ 0. 0. 1. 0.]\n"," [ 0. 0. 0. 1.]]\n","\n"," [[ 1. 0. 0. 0.]\n"," [ 0. 1. 0. 0.]\n"," [ 0. 0. 1. 0.]\n"," [ 0. 0. 0. 1.]]\n","\n"," [[ 2. 2. 5. 0.]\n"," [ 2. 5. 10. 0.]\n"," [ 5. 10. 26. 0.]\n"," [ 0. 0. 0. 1.]]]\n","[[[0.]\n"," [0.]\n"," [0.]\n"," [0.]]\n","\n"," [[0.]\n"," [0.]\n"," [0.]\n"," [0.]]\n","\n"," [[0.]\n"," [0.]\n"," [0.]\n"," [0.]]\n","\n"," [[1.]\n"," [2.]\n"," [5.]\n"," [0.]]]\n","0\n","[[[ 1. 0. 0. 0.]\n"," [ 0. 1. 0. 0.]\n"," [ 0. 0. 1. 0.]\n"," [ 0. 0. 0. 1.]]\n","\n"," [[ 1. 0. 0. 0.]\n"," [ 0. 1. 0. 0.]\n"," [ 0. 0. 1. 0.]\n"," [ 0. 0. 0. 1.]]\n","\n"," [[ 1. 0. 0. 0.]\n"," [ 0. 1. 0. 0.]\n"," [ 0. 0. 1. 0.]\n"," [ 0. 0. 0. 1.]]\n","\n"," [[ 2. 2. 5. 0.]\n"," [ 2. 5. 10. 0.]\n"," [ 5. 10. 26. 0.]\n"," [ 0. 0. 0. 1.]]]\n","[[[0.]\n"," [0.]\n"," [0.]\n"," [0.]]\n","\n"," [[0.]\n"," [0.]\n"," [0.]\n"," [0.]]\n","\n"," [[0.]\n"," [0.]\n"," [0.]\n"," [0.]]\n","\n"," [[1.]\n"," [2.]\n"," [5.]\n"," [0.]]]\n","0\n"]}]},{"cell_type":"markdown","source":["### LinTS Agent"],"metadata":{"id":"4L_OJQQEvP4k"}},{"cell_type":"code","source":["class LinTSAgent(BaseAgent):\n","\n"," def __init__(self):\n"," super().__init__()\n"," self.name = \"LinTS\"\n","\n"," def agent_init(self, agent_info=None):\n","\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," self.num_actions = agent_info.get('num_actions', 3)\n"," self.alpha = agent_info.get('alpha', 1)\n"," self.lambda_ = agent_info.get('lambda', 1)\n"," self.batch_size = agent_info.get('batch_size', 1)\n"," # Set random seed for policy for each run\n"," self.policy_rand_generator = np.random.RandomState(agent_info.get(\"seed\", None))\n","\n"," self.replay_buffer = ReplayBuffer(agent_info['replay_buffer_size'],\n"," agent_info.get(\"seed\"))\n","\n","\n"," self.last_action = None\n"," self.last_state = None\n"," self.num_round = None\n","\n"," def agent_policy(self, observation, mode='sample'):\n"," p_t = np.zeros(self.num_actions)\n"," cntx = observation\n","\n"," for i in range(self.num_actions):\n"," # sampling weights after update\n"," self.w = self.get_weights(i)\n","\n"," # using weight depending on mode\n"," if mode == 'sample':\n"," w = self.w # weights are samples of posteriors\n"," elif mode == 'expected':\n"," w = self.m[i] # weights are expected values of posteriors\n"," else:\n"," raise Exception('mode not recognized!')\n","\n"," # calculating probabilities\n"," p_t[i] = 1 / (1 + np.exp(-1 * cntx.dot(w)))\n"," action = self.policy_rand_generator.choice(np.where(p_t == max(p_t))[0])\n"," # probs = softmax(p_t.reshape(1, -1))\n"," # action = self.policy_rand_generator.choice(a=range(self.num_actions), p=probs)\n","\n"," return action\n","\n"," def get_weights(self, arm):\n"," return np.random.normal(self.m[arm], self.alpha * self.q[arm] ** (-1.0), size=len(self.w))\n","\n"," # the loss function\n"," def loss(self, w, *args):\n"," X, y = args\n"," return 0.5 * (self.q[self.last_action] * (w - self.m[self.last_action])).dot(w - self.m[self.last_action]) + np.sum(\n"," [np.log(1 + np.exp(-y[j] * w.dot(X[j]))) for j in range(y.shape[0])])\n","\n"," # the gradient\n"," def grad(self, w, *args):\n"," X, y = args\n"," return self.q[self.last_action] * (w - self.m[self.last_action]) + (-1) * np.array(\n"," [y[j] * X[j] / (1. + np.exp(y[j] * w.dot(X[j]))) for j in range(y.shape[0])]).sum(axis=0)\n","\n"," # fitting method\n"," def agent_update(self, X, y):\n"," # step 1, find w\n"," self.w = minimize(self.loss, self.w, args=(X, y), jac=self.grad, method=\"L-BFGS-B\",\n"," options={'maxiter': 20, 'disp': False}).x\n"," # self.m_oracle[self.last_action] = self.w\n"," self.m[self.last_action] = self.w\n","\n"," # step 2, update q\n"," P = (1 + np.exp(1 - X.dot(self.m[self.last_action]))) ** (-1)\n"," #self.q_oracle[self.last_action] = self.q[self.last_action] + (P * (1 - P)).dot(X ** 2)\n"," self.q[self.last_action] = self.q[self.last_action] + (P * (1 - P)).dot(X ** 2)\n","\n"," def agent_start(self, observation):\n"," # Specify feature dimension\n"," self.ndims = len(observation)\n","\n"," # initializing parameters of the model\n"," self.m = np.zeros((self.num_actions, self.ndims))\n"," self.q = np.ones((self.num_actions, self.ndims)) * self.lambda_\n"," # initializing weights using any arm (e.g. 0) because they all equal\n"," self.w = np.array([0.]*self.ndims, dtype=np.float64)\n","\n"," # self.m_oracle = self.m.copy()\n"," # self.q_oracle = self.q.copy()\n","\n"," self.last_state = observation\n"," self.last_action = self.agent_policy(self.last_state)\n"," self.num_round = 0\n","\n"," return self.last_action\n","\n","\n"," def agent_step(self, reward, observation):\n"," # Append new experience to replay buffer\n"," if reward is not None:\n"," self.replay_buffer.append(self.last_state, self.last_action, reward)\n"," # it is a good question whether I should increment num_round outside\n"," # condition or not (since theoretical result doesn't clarify this\n"," self.num_round += 1\n","\n"," if self.num_round % self.batch_size == 0:\n"," X, y = self.replay_buffer.sample(self.last_action)\n"," X = np.array(X)\n"," y = np.array(y)\n"," self.agent_update(X, y)\n"," # self.m = self.m_oracle.copy()\n"," # self.q = self.q_oracle.copy()\n","\n"," self.last_state = observation\n"," self.last_action = self.agent_policy(self.last_state)\n","\n"," return self.last_action\n","\n"," def agent_end(self, reward):\n"," # Append new experience to replay buffer\n"," if reward is not None:\n"," self.replay_buffer.append(self.last_state, self.last_action, reward)\n"," # it is a good question whether I should increment num_round outside\n"," # condition or not (since theoretical result doesn't clarify this\n"," self.num_round += 1\n","\n"," if self.num_round % self.batch_size == 0:\n"," X, y = self.replay_buffer.sample(self.last_action)\n"," X = np.array(X)\n"," y = np.array(y)\n"," self.agent_update(X, y)\n"," # self.m = self.m_oracle.copy()\n"," # self.q = self.q_oracle.copy()\n","\n"," def agent_message(self, message):\n"," pass\n","\n"," def agent_cleanup(self):\n"," pass"],"metadata":{"id":"X7mSGLS4vP20"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","# agent_info = {'alpha': 2,\n","# 'num_actions': 3,\n","# 'seed': 1,\n","# 'lambda': 2,\n","# 'replay_buffer_size': 100000}\n","\n","# np.random.seed(1)\n","# # check initialization\n","# lints = LinTSAgent()\n","# lints.agent_init(agent_info)\n","# print(lints.num_actions, lints.alpha, lints.lambda_)\n","\n","# assert lints.num_actions == 3\n","# assert lints.alpha == 2\n","# assert lints.lambda_ == 2\n","\n","# # check agent policy\n","# observation = np.array([1, 2, 5, 0])\n","# lints.m = np.zeros((lints.num_actions, len(observation)))\n","# lints.q = np.ones((lints.num_actions, len(observation))) * lints.lambda_\n","# lints.w = np.random.normal(lints.m[0], lints.alpha * lints.q[0] ** (-1.0), size=len(observation))\n","# print(lints.w)\n","# action = lints.agent_policy(observation)\n","# print(action)\n","\n","# # check agent start\n","# observation = np.array([1, 2, 5, 0])\n","# lints.agent_start(observation)\n","# # manually reassign w to np.random.normal, because I np.seed doesn't work inside the class\n","# np.random.seed(1)\n","# lints.w = np.random.normal(lints.m[0], lints.alpha * lints.q[0] ** (-1.0), size=len(observation))\n","# print(lints.ndims)\n","# print(lints.last_state, lints.last_action)\n","# print(lints.last_action)\n","# assert lints.ndims == len(observation)\n","# assert np.allclose(lints.last_state, observation)\n","# assert np.allclose(lints.m, np.zeros((lints.num_actions, lints.ndims)))\n","# assert np.allclose(lints.q, np.ones((lints.num_actions, lints.ndims)) * lints.lambda_)\n","# assert np.allclose(lints.w, np.array([ 1.62434536, -0.61175641, -0.52817175, -1.07296862]))\n","# # assert lints.last_action == 1\n","\n","# # check step\n","# observation = np.array([5, 3, 1, 2])\n","# reward = 1\n","# action = lints.agent_step(reward, observation)\n","# print(action)\n","\n","# observation = np.array([1, 3, 2, 1])\n","# reward = 0\n","# action = lints.agent_step(reward, observation)\n","# print(action)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yr9HfGeJy-vR","executionInfo":{"status":"ok","timestamp":1639148425016,"user_tz":-330,"elapsed":3,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"4037b3ed-73b8-4057-8ea7-c1cb4d7fd177"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["3 2 2\n","[ 1.62434536 -0.61175641 -0.52817175 -1.07296862]\n","1\n","4\n","[1 2 5 0] 1\n","1\n","1\n","1\n"]}]},{"cell_type":"markdown","source":["## Environments"],"metadata":{"id":"IQr77JFsu6Jq"}},{"cell_type":"markdown","source":["### Base Environment"],"metadata":{"id":"oAuUEthsu9TG"}},{"cell_type":"markdown","source":["Abstract environment base class for RL-Glue-py."],"metadata":{"id":"pEz4-17VvAZQ"}},{"cell_type":"code","source":["class BaseEnvironment:\n"," \"\"\"Implements the environment for an RLGlue environment\n"," Note:\n"," env_init, env_start, env_step, env_cleanup, and env_message are required\n"," methods.\n"," \"\"\"\n","\n"," __metaclass__ = ABCMeta\n","\n"," def __init__(self):\n"," reward = None\n"," observation = None\n"," termination = None\n"," self.reward_state_term = (reward, observation, termination)\n","\n"," @abstractmethod\n"," def env_init(self, env_info={}):\n"," \"\"\"Setup for the environment called when the experiment first starts.\n"," Note:\n"," Initialize a tuple with the reward, first state observation, boolean\n"," indicating if it's terminal.\n"," \"\"\"\n","\n"," @abstractmethod\n"," def env_start(self):\n"," \"\"\"The first method called when the experiment starts, called before the\n"," agent starts.\n"," Returns:\n"," The first state observation from the environment.\n"," \"\"\"\n","\n"," @abstractmethod\n"," def env_step(self, action):\n"," \"\"\"A step taken by the environment.\n"," Args:\n"," action: The action taken by the agent\n"," Returns:\n"," (float, state, Boolean): a tuple of the reward, state observation,\n"," and boolean indicating if it's terminal.\n"," \"\"\"\n","\n"," @abstractmethod\n"," def env_cleanup(self):\n"," \"\"\"Cleanup done after the environment ends\"\"\"\n","\n"," @abstractmethod\n"," def env_message(self, message):\n"," \"\"\"A message asking the environment for information\n"," Args:\n"," message: the message passed to the environment\n"," Returns:\n"," the response (or answer) to the message\n"," \"\"\""],"metadata":{"id":"qqZDb6A9u-85"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### k-arm Environment"],"metadata":{"id":"_Mm2zTKyv3Fb"}},{"cell_type":"code","source":["class Environment(BaseEnvironment):\n"," \"\"\"Implements the environment for an RLGlue environment\n"," Note:\n"," env_init, env_start, env_step, env_cleanup, and env_message are required\n"," methods.\n"," \"\"\"\n","\n"," actions = [0]\n","\n"," def __init__(self):\n"," super().__init__()\n"," reward = None\n"," observation = None\n"," termination = None\n"," self.seed = None\n"," self.k = None\n"," self.reward_type = None\n"," self.custom_arms = None\n"," self.reward_state_term = (reward, observation, termination)\n"," self.count = 0\n"," self.arms = []\n"," self.subopt_gaps = None\n","\n"," def env_init(self, env_info=None):\n"," \"\"\"Setup for the environment called when the experiment first starts.\n"," Note:\n"," Initialize a tuple with the reward, first state observation, boolean\n"," indicating if it's terminal.\n"," \"\"\"\n","\n"," if env_info is None:\n"," env_info = {}\n"," self.k = env_info.get(\"num_actions\", 2)\n"," self.reward_type = env_info.get(\"reward_type\", \"subgaussian\")\n"," self.custom_arms = env_info.get(\"arms_values\", None)\n","\n"," if self.reward_type not in ['Bernoulli', 'subgaussian']:\n"," raise ValueError('Unknown reward_type: ' + str(self.reward_type))\n","\n"," if self.custom_arms is None:\n"," if self.reward_type == 'Bernoulli':\n"," self.arms = np.random.uniform(0, 1, self.k)\n"," else:\n"," self.arms = np.random.randn(self.k)\n"," else:\n"," self.arms = self.custom_arms\n"," self.subopt_gaps = np.max(self.arms) - self.arms\n","\n"," local_observation = 0 # An empty NumPy array\n","\n"," self.reward_state_term = (0.0, local_observation, False)\n","\n"," def env_start(self):\n"," \"\"\"The first method called when the experiment starts, called before the\n"," agent starts.\n"," Returns:\n"," The first state observation from the environment.\n"," \"\"\"\n","\n"," return self.reward_state_term[1]\n","\n"," def env_step(self, action):\n"," \"\"\"A step taken by the environment.\n"," Args:\n"," action: The action taken by the agent\n"," Returns:\n"," (float, state, Boolean): a tuple of the reward, state observation,\n"," and boolean indicating if it's terminal.\n"," \"\"\"\n"," if self.reward_type == 'Bernoulli':\n"," reward = np.random.binomial(1, self.arms[action], 1)\n"," else:\n"," reward = self.arms[action] + np.random.randn()\n"," obs = self.reward_state_term[1]\n","\n"," self.reward_state_term = (reward, obs, False)\n","\n"," return self.reward_state_term\n","\n"," def env_cleanup(self):\n"," \"\"\"Cleanup done after the environment ends\"\"\"\n"," pass\n","\n"," def env_message(self, message):\n"," \"\"\"A message asking the environment for information\n"," Args:\n"," message (string): the message passed to the environment\n"," Returns:\n"," string: the response (or answer) to the message\n"," \"\"\"\n"," if message == \"what is the current reward?\":\n"," return \"{}\".format(self.reward_state_term[0])\n","\n"," # else\n"," return \"I don't know how to respond to your message\""],"metadata":{"id":"YLTkxvLGvC4g"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Offline Evaluator"],"metadata":{"id":"naYFRhirzYfu"}},{"cell_type":"code","source":["class OfflineEvaluator:\n"," def __init__(self, eval_info=None):\n","\n"," if eval_info is None:\n"," eval_info = {}\n","\n"," self.dataset = eval_info['dataset']\n"," self.agent = eval_info['agent']\n","\n"," if not isinstance(self.dataset, Dataset):\n"," raise TypeError('dataset ' + \"must be a \" + str(Dataset))\n"," if not isinstance(self.agent, BaseAgent):\n"," raise TypeError('agent ' + \"must be a \" + str(BaseAgent))\n","\n"," self.total_reward = None\n"," self.average_reward = None\n"," self.num_matches = None\n"," self.idxs = range(self.dataset.__len__())\n"," self.counter = None\n","\n"," def eval_start(self):\n"," self.total_reward = 0\n"," self.average_reward = [0]\n"," self.num_matches = 0\n"," self.idxs = range(self.dataset.__len__())\n"," self.counter = 0\n","\n"," def _get_observation(self):\n"," idx = self.idxs[self.counter]\n"," self.counter += 1\n","\n"," return self.dataset.__getitem__(idx)\n","\n"," def eval_step(self):\n"," observation = self._get_observation()\n","\n"," state = observation[0]\n"," true_action = observation[1]\n"," reward = observation[2]\n","\n"," pred_action = self.agent.agent_policy(state)\n","\n"," if true_action != pred_action:\n"," return\n","\n"," self.num_matches += 1\n"," aw_reward = self.average_reward[-1] + (reward - self.average_reward[-1]) / self.num_matches\n"," self.average_reward.append(aw_reward)\n"," self.total_reward += reward\n","\n"," def eval_run(self):\n"," self.eval_start()\n","\n"," while self.counter < self.dataset.__len__():\n"," self.eval_step()\n","\n"," return self.average_reward"],"metadata":{"id":"iJLVLYunzbPe"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","\n","# dir1 = 'data/mushroom_data_final.pickle'\n","\n","# ra = RandomAgent()\n","# agent_info = {'num_actions': 2}\n","# ra.agent_init(agent_info)\n","\n","# result = []\n","# result1 = []\n","\n","# for seed_ in [1, 5, 10]: # , 2, 3, 32, 123, 76, 987, 2134]:\n","# dataset = BanditDataset(pickle_file=dir1, seed=seed_)\n","\n","# eval_info = {'dataset': dataset, 'agent': ra}\n","# evaluator = OfflineEvaluator(eval_info)\n","\n","# reward = evaluator.eval_run()\n","\n","# result.append(reward)\n","# result1.append(evaluator.total_reward)\n","\n","# for elem in result:\n","# plt.plot(elem)\n","# plt.legend()\n","# plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":282},"id":"BY8sASekzc6S","executionInfo":{"status":"ok","timestamp":1639148441141,"user_tz":-330,"elapsed":14,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"1ddaab3a-5b2f-41a8-842f-407aaa3b1f62"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stderr","text":["No handles with labels found to put in legend.\n"]},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["### Replay Environment"],"metadata":{"id":"tL1Ur1CtzlGx"}},{"cell_type":"code","source":["class ReplayEnvironment(BaseEnvironment):\n"," dataset: BanditDataset\n","\n"," def __init__(self):\n"," super().__init__()\n"," self.counter = None\n"," self.last_observation = None\n","\n"," def env_init(self, env_info=None):\n"," \"\"\"\n"," Set parameters needed to setup the replay SavePilot environment.\n"," Assume env_info dict contains:\n"," {\n"," pickle_file: data directory [str]\n"," }\n"," Args:\n"," env_info (dict):\n"," \"\"\"\n"," if env_info is None:\n"," env_info = {}\n","\n"," directory = env_info['pickle_file']\n"," seed = env_info.get('seed', None)\n"," self.dataset = BanditDataset(directory, seed)\n"," self.idxs = range(self.dataset.__len__())\n"," self.counter = 0\n","\n"," def _get_observation(self):\n"," idx = self.idxs[self.counter]\n","\n"," return self.dataset.__getitem__(idx)\n","\n"," def env_start(self):\n"," self.last_observation = self._get_observation()\n","\n"," state = self.last_observation[0]\n"," reward = None\n"," is_terminal = False\n","\n"," self.reward_state_term = (reward, state, is_terminal)\n"," self.counter += 1\n","\n"," # return first state from the environment\n"," return self.reward_state_term[1]\n","\n"," def env_step(self, action):\n"," true_action = self.last_observation[1]\n"," reward = self.last_observation[2]\n","\n"," if true_action != action:\n"," reward = None\n","\n"," observation = self._get_observation()\n"," state = observation[0]\n","\n"," if self.counter == self.dataset.__len__() - 1:\n"," is_terminal = True\n"," else:\n"," is_terminal = False\n","\n"," self.reward_state_term = (reward, state, is_terminal)\n","\n"," self.last_observation = observation\n"," self.counter += 1\n","\n"," return self.reward_state_term\n","\n"," def env_cleanup(self):\n"," pass\n","\n"," def env_message(self, message):\n"," pass"],"metadata":{"id":"YK8fE2VyzlEO"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Wrappers"],"metadata":{"id":"s42XsgHev0lv"}},{"cell_type":"markdown","source":["### RL Glue"],"metadata":{"id":"OlbboMWrwRV2"}},{"cell_type":"code","source":["class RLGlue:\n"," \"\"\"RLGlue class\n"," args:\n"," env_name (string): the name of the module where the Environment class can be found\n"," agent_name (string): the name of the module where the Agent class can be found\n"," \"\"\"\n","\n"," def __init__(self, env_class, agent_class):\n"," self.environment = env_class()\n"," self.agent = agent_class()\n","\n"," self.total_reward = None\n"," self.average_reward = None\n"," self.last_action = None\n"," self.num_steps = None\n"," self.num_episodes = None\n"," self.num_matches = None\n","\n"," def rl_init(self, agent_init_info={}, env_init_info={}):\n"," \"\"\"Initial method called when RLGlue experiment is created\"\"\"\n"," self.environment.env_init(env_init_info)\n"," self.agent.agent_init(agent_init_info)\n","\n"," self.total_reward = 0.0\n"," self.average_reward = [0]\n"," self.num_steps = 0\n"," self.num_episodes = 0\n"," self.num_matches = 0\n","\n"," def rl_start(self):\n"," \"\"\"Starts RLGlue experiment\n"," Returns:\n"," tuple: (state, action)\n"," \"\"\"\n","\n"," last_state = self.environment.env_start()\n"," self.last_action = self.agent.agent_start(last_state)\n","\n"," observation = (last_state, self.last_action)\n","\n"," return observation\n","\n"," def rl_agent_start(self, observation):\n"," \"\"\"Starts the agent.\n"," Args:\n"," observation: The first observation from the environment\n"," Returns:\n"," The action taken by the agent.\n"," \"\"\"\n"," return self.agent.agent_start(observation)\n","\n"," def rl_agent_step(self, reward, observation):\n"," \"\"\"Step taken by the agent\n"," Args:\n"," reward (float): the last reward the agent received for taking the\n"," last action.\n"," observation : the state observation the agent receives from the\n"," environment.\n"," Returns:\n"," The action taken by the agent.\n"," \"\"\"\n"," return self.agent.agent_step(reward, observation)\n","\n"," def rl_agent_end(self, reward):\n"," \"\"\"Run when the agent terminates\n"," Args:\n"," reward (float): the reward the agent received when terminating\n"," \"\"\"\n"," self.agent.agent_end(reward)\n","\n"," def rl_env_start(self):\n"," \"\"\"Starts RL-Glue environment.\n"," Returns:\n"," (float, state, Boolean): reward, state observation, boolean\n"," indicating termination\n"," \"\"\"\n"," self.total_reward = 0.0\n"," self.num_steps = 1\n","\n"," this_observation = self.environment.env_start()\n","\n"," return this_observation\n","\n"," def rl_env_step(self, action):\n"," \"\"\"Step taken by the environment based on action from agent\n"," Args:\n"," action: Action taken by agent.\n"," Returns:\n"," (float, state, Boolean): reward, state observation, boolean\n"," indicating termination.\n"," \"\"\"\n"," ro = self.environment.env_step(action)\n"," (this_reward, _, terminal) = ro\n","\n"," self.total_reward += this_reward\n","\n"," if terminal:\n"," self.num_episodes += 1\n"," else:\n"," self.num_steps += 1\n","\n"," return ro\n","\n"," def rl_step(self):\n"," \"\"\"Step taken by RLGlue, takes environment step and either step or\n"," end by agent.\n"," Returns:\n"," (float, state, action, Boolean): reward, last state observation,\n"," last action, boolean indicating termination\n"," \"\"\"\n","\n"," (reward, last_state, term) = self.environment.env_step(self.last_action)\n","\n"," if reward is not None:\n"," self.num_matches += 1\n"," aw_reward = self.average_reward[-1] + (reward - self.average_reward[-1]) / self.num_matches\n"," self.average_reward.append(aw_reward)\n"," self.total_reward += reward\n","\n"," if term:\n"," self.num_episodes += 1\n"," self.agent.agent_end(reward)\n"," roat = (reward, last_state, None, term)\n"," else:\n"," self.num_steps += 1\n"," self.last_action = self.agent.agent_step(reward, last_state)\n"," roat = (reward, last_state, self.last_action, term)\n","\n"," return roat\n","\n"," def rl_cleanup(self):\n"," \"\"\"Cleanup done at end of experiment.\"\"\"\n"," self.environment.env_cleanup()\n"," self.agent.agent_cleanup()\n","\n"," def rl_agent_message(self, message):\n"," \"\"\"Message passed to communicate with agent during experiment\n"," Args:\n"," message: the message (or question) to send to the agent\n"," Returns:\n"," The message back (or answer) from the agent\n"," \"\"\"\n","\n"," return self.agent.agent_message(message)\n","\n"," def rl_env_message(self, message):\n"," \"\"\"Message passed to communicate with environment during experiment\n"," Args:\n"," message: the message (or question) to send to the environment\n"," Returns:\n"," The message back (or answer) from the environment\n"," \"\"\"\n"," return self.environment.env_message(message)\n","\n"," def rl_episode(self, max_steps_this_episode):\n"," \"\"\"Runs an RLGlue episode\n"," Args:\n"," max_steps_this_episode (Int): the maximum steps for the experiment to run in an episode\n"," Returns:\n"," Boolean: if the episode should terminate\n"," \"\"\"\n"," is_terminal = False\n","\n"," self.rl_start()\n","\n"," while (not is_terminal) and ((max_steps_this_episode == 0) or\n"," (self.num_steps < max_steps_this_episode)):\n"," rl_step_result = self.rl_step()\n"," is_terminal = rl_step_result[3]\n","\n"," return is_terminal\n","\n"," def rl_return(self):\n"," \"\"\"The total reward\n"," Returns:\n"," float: the total reward\n"," \"\"\"\n"," return self.total_reward\n","\n"," def rl_num_steps(self):\n"," \"\"\"The total number of steps taken\n"," Returns:\n"," Int: the total number of steps taken\n"," \"\"\"\n"," return self.num_steps\n","\n"," def rl_num_episodes(self):\n"," \"\"\"The number of episodes\n"," Returns\n"," Int: the total number of episodes\n"," \"\"\"\n"," return self.num_episodes"],"metadata":{"id":"InGf3vAFwTIF"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Policy"],"metadata":{"id":"MCXJTVo5xRpq"}},{"cell_type":"code","source":["class Policy:\n"," def __init__(self, env, agent):\n"," self.env = env\n"," self.agent = agent\n"," self.rl_glue = None\n","\n"," @abstractmethod\n"," def get_average_performance(self, agent_info=None, env_info=None, exper_info=None):\n"," raise NotImplementedError"],"metadata":{"id":"9RsPVJpnwmad"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Bandit wrapper"],"metadata":{"id":"RbiWk0wWxTD-"}},{"cell_type":"code","source":["class BanditWrapper(Policy):\n"," def get_average_performance(self, agent_info=None, env_info=None, exper_info=None):\n","\n"," if exper_info is None:\n"," exper_info = {}\n"," if env_info is None:\n"," env_info = {}\n"," if agent_info is None:\n"," agent_info = {}\n","\n"," num_runs = exper_info.get(\"num_runs\", 100)\n"," num_steps = exper_info.get(\"num_steps\", 1000)\n"," return_type = exper_info.get(\"return_type\", None)\n"," seed = exper_info.get(\"seed\", None)\n","\n"," np.random.seed(seed)\n"," seeds = np.random.randint(0, num_runs * 100, num_runs)\n","\n"," all_averages = []\n"," subopt_arm_average = []\n"," best_arm = []\n"," worst_arm = []\n"," all_chosen_arm = []\n"," average_regret = []\n","\n"," for run in tqdm(range(num_runs)):\n"," np.random.seed(seeds[run])\n","\n"," self.rl_glue = RLGlue(self.env, self.agent)\n"," self.rl_glue.rl_init(agent_info, env_info)\n"," (first_state, first_action) = self.rl_glue.rl_start()\n","\n"," worst_position = np.argmin(self.rl_glue.environment.arms)\n"," best_value = np.max(self.rl_glue.environment.arms)\n"," worst_value = np.min(self.rl_glue.environment.arms)\n"," best_arm.append(best_value)\n"," worst_arm.append(worst_value)\n","\n"," scores = [0]\n"," averages = []\n"," subopt_arm = []\n"," chosen_arm_log = []\n","\n"," cum_regret = [0]\n"," delta = self.rl_glue.environment.subopt_gaps[first_action]\n"," cum_regret.append(cum_regret[-1] + delta)\n","\n"," # first action was made in rl_start, that's why run over num_steps-1\n"," for i in range(num_steps-1):\n"," reward, _, action, _ = self.rl_glue.rl_step()\n"," chosen_arm_log.append(action)\n"," scores.append(scores[-1] + reward)\n"," averages.append(scores[-1] / (i + 1))\n"," subopt_arm.append(self.rl_glue.agent.arm_count[worst_position])\n","\n"," delta = self.rl_glue.environment.subopt_gaps[action]\n"," cum_regret.append(cum_regret[-1] + delta)\n","\n"," all_averages.append(averages)\n"," subopt_arm_average.append(subopt_arm)\n"," all_chosen_arm.append(chosen_arm_log)\n","\n"," average_regret.append(cum_regret)\n","\n"," if return_type is None:\n"," returns = (np.mean(all_averages, axis=0),\n"," np.mean(best_arm))\n"," elif return_type == 'regret':\n"," returns = np.mean(average_regret, axis=0)\n"," elif return_type == 'regret_reward':\n"," returns = (np.mean(average_regret, axis=0),\n"," np.mean(all_averages, axis=0))\n"," elif return_type == 'arm_choice_analysis':\n"," returns = (np.mean(all_averages, axis=0),\n"," np.mean(best_arm),\n"," np.mean(all_chosen_arm, axis=0))\n"," elif return_type == 'complex':\n"," returns = (np.mean(all_averages, axis=0),\n"," np.mean(subopt_arm_average, axis=0),\n"," np.array(best_arm), np.array(worst_arm),\n"," np.mean(average_regret, axis=0))\n","\n"," return returns"],"metadata":{"id":"zAzjgURdwsl5"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Run experiments"],"metadata":{"id":"58Lm6nzi3c7a"}},{"cell_type":"code","source":["def run_experiment(environment, agent, environment_parameters, agent_parameters,\n"," experiment_parameters, save_data=True, dir=''):\n"," rl_glue = RLGlue(environment, agent)\n","\n"," # save sum of reward at the end of each episode\n"," agent_sum_reward = []\n","\n"," env_info = environment_parameters\n"," agent_info = agent_parameters\n","\n"," # one agent setting\n"," for run in tqdm(range(1, experiment_parameters[\"num_runs\"] + 1)):\n"," env_info[\"seed\"] = run\n","\n"," rl_glue.rl_init(agent_info, env_info)\n"," rl_glue.rl_episode(0)\n"," agent_sum_reward.append(rl_glue.average_reward)\n","\n"," leveled_result = get_leveled_data(agent_sum_reward)\n"," if save_data:\n"," save_name = \"{}-{}\".format(rl_glue.agent.name, rl_glue.agent.batch_size)\n"," file_dir = \"results/{}\".format(dir)\n"," if not os.path.exists(file_dir):\n"," os.makedirs(file_dir)\n"," np.save(\"{}/sum_reward_{}\".format(file_dir, save_name), leveled_result)\n","\n"," return leveled_result"],"metadata":{"id":"GWc2CLhz3c2E"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# if __name__ == '__main__':\n","\n","# num_experements = 10\n","# batch_size = 100\n","# data_dir = 'data/mushroom_data_final.pickle'\n","\n","# experiment_parameters = {\"num_runs\": num_experements}\n","# env_info = {'pickle_file': data_dir}\n","# agent_info = {'alpha': 2,\n","# 'num_actions': 3,\n","# 'seed': 1,\n","# 'batch_size': 1}\n","\n","# agent = LinUCBAgent\n","# environment = ReplayEnvironment\n","\n","# result = run_experiment(environment, agent, env_info, agent_info, experiment_parameters, save_data=False)\n","\n","# smoothed_leveled_result = smooth(result, 100)\n","# mean_smoothed_leveled_result = np.mean(smoothed_leveled_result, axis=0)\n","\n","# plt.plot(mean_smoothed_leveled_result, lw=3, ls='-.', label='online policy')\n","# plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":297,"referenced_widgets":["87c240ca0fe8431096f5092d00b6d63f","6933623da13c468ea1caba8cb1e126f5","3beaa54b58654d2199153c4229b50f84","317c46945fd64488ad7b2cc0bf30b7d2","fa2e58ea24f84364b95fcc3f1587e9ad","afa78843d54d404ab99cd87d55a36bb9","0c9761efc1a04534871cb6c05f232f4a","21b40574fdb44788af67ece3c7b770c6","0a8e3b93b06740ad8cb9075dbf5d041a","bcaa037ccf1b47bf8d40956a370f93dc","2258f153219f48cc882eda53f0db33a2"]},"id":"oLbyRqGi3miH","executionInfo":{"status":"ok","timestamp":1639148611213,"user_tz":-330,"elapsed":8524,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"d2341afc-3a7d-4ca0-ff62-a1904cad3dc8"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"87c240ca0fe8431096f5092d00b6d63f","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/10 [00:00, ?it/s]"]},"metadata":{}},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["