{"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
classescap-shapecap-surfacecap-colorbruises?odorgill-attachmentgill-spacinggill-sizegill-colorstalk-shapestalk-rootstalk-surface-above-ringstalk-surface-below-ringstalk-color-above-ringstalk-color-below-ringveil-typeveil-colorring-numberring-typespore-print-colorpopulationhabitat
0pxsntpfcnkeesswwpwopksu
1exsytafcbkecsswwpwopnng
2ebswtlfcbnecsswwpwopnnm
3pxywtpfcnneesswwpwopksu
4exsgfnfwbktesswwpwoenag
\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\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
classescap-shapecap-surfacecap-colorbruises?odorgill-attachmentgill-spacinggill-sizegill-colorstalk-shapestalk-rootstalk-surface-above-ringstalk-surface-below-ringstalk-color-above-ringstalk-color-below-ringveil-typeveil-colorring-numberring-typespore-print-colorpopulationhabitat
gini_train1.00.1852250.1809560.2077930.4958150.9674870.0401170.2562510.4905630.7583490.102960.4298980.5437430.5340910.5440610.5345530.00.0457910.1146170.6270000.7616040.5190780.444780
gini_test1.00.2127790.2011180.2372780.4900010.9695550.0446830.2578580.5352030.7600570.093950.4260110.5304220.5329510.5280230.5166070.00.0547050.1171930.6220520.7460500.5104360.476353
\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":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
gini_traingini_test
0
odor0.9674870.969555
gill-size0.4905630.535203
gill-spacing0.2562510.257858
stalk-shape0.1029600.093950
habitat0.4447800.476353
\n","
"],"text/plain":[" gini_train gini_test\n","0 \n","odor 0.967487 0.969555\n","gill-size 0.490563 0.535203\n","gill-spacing 0.256251 0.257858\n","stalk-shape 0.102960 0.093950\n","habitat 0.444780 0.476353"]},"metadata":{},"execution_count":12}]},{"cell_type":"code","source":["mushroom_data_features = mushroom_data[ids_vars + [\"classes\"]]\n","mushroom_data = mushroom_data_features.loc[mushroom_data_features.index.repeat(4)].reset_index(drop=True)\n","\n","mushroom_data[\"a\"] = np.random.choice([0, 1], mushroom_data.shape[0])\n","mushroom_data[\"probs\"] = 1\n","mushroom_data[\"y\"] = 0\n","\n","eat_edible = (1-mushroom_data[\"classes\"]) * mushroom_data[\"a\"] * 1\n","eat_poisonous = mushroom_data[\"classes\"] * mushroom_data[\"a\"] * np.random.choice([1, -1], mushroom_data.shape[0])\n","mushroom_data[\"y\"] = eat_edible + eat_poisonous\n","new_names = ['X_' + str(i+1) for i in range(len(ids_vars))] \n","mushroom_data = mushroom_data.rename(columns=dict(zip(ids_vars, new_names)))\n","\n","mushroom_data_final = mushroom_data[new_names + ['a', 'y', 'probs']]\n","mushroom_data_final.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"vEXcrpMis7Pi","executionInfo":{"status":"ok","timestamp":1639145844306,"user_tz":-330,"elapsed":39,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"bcb3014b-6da3-4627-e4a8-9e224a253f2a"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
X_1X_2X_3X_4X_5ayprobs
061005111
161005001
261005001
3610051-11
400001111
\n","
"],"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"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
X_1X_2X_3X_4ayprobs
013000.00.00.266661
131311.00.00.236514
230011.00.00.236514
303101.00.00.236514
421200.00.00.266661
\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"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["## Experiments"],"metadata":{"id":"kD7w8VVTwmV-"}},{"cell_type":"markdown","source":["### UCB"],"metadata":{"id":"S9-ruIHEwmTS"}},{"cell_type":"markdown","source":["#### UCB dynamic by timesteps"],"metadata":{"id":"iSarqXSj5buA"}},{"cell_type":"code","source":["env = Environment\n","agent = UCBAgent\n","\n","alpha = 1\n","\n","num_runs = 1000\n","num_steps = 10000\n","seed = None\n","if_save = False\n","exper_info = {\"num_runs\": num_runs,\n"," \"num_steps\": num_steps,\n"," \"seed\": seed,\n"," \"return_type\": \"regret\"}\n","\n","k = 2\n","arms_values = [0.7, 0.65]\n","reward_type = 'Bernoulli'\n","env_info = {\"num_actions\": k,\n"," \"reward_type\": reward_type,\n"," \"arms_values\": arms_values}\n","\n","# batch-online experiment\n","batch_res = []\n","online_res = []\n","batch = 10\n","agent_info_batch = {\"num_actions\": k, \"batch_size\": batch, \"alpha\": alpha}\n","agent_info_online = {\"num_actions\": k, \"batch_size\": 1, \"alpha\": alpha}\n","\n","exp1 = BanditWrapper(env, agent)\n","batch_res.append(exp1.get_average_performance(agent_info_batch, env_info, exper_info))\n","online_res.append(exp1.get_average_performance(agent_info_online, env_info, exper_info))\n","\n","av_online_res = np.mean(online_res, axis=0)\n","av_batch_res = np.mean(batch_res, axis=0)\n","\n","plt.plot(av_batch_res, label='batch')\n","plt.plot(av_online_res, label='online')\n","\n","M = int(num_steps / batch)\n","update_points = np.ceil(np.arange(num_steps) / batch).astype(int)\n","plt.plot(av_online_res[update_points] * batch, ls='--',\n"," label='upper bound, batch size = 10')\n","plt.title('Cumulative Regret averaged over ' + str(num_runs) + ' runs')\n","plt.xlabel('time steps')\n","plt.ylabel('regret')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.legend()\n","if if_save:\n"," plt.savefig('results/UCB transform example.png', bbox_inches='tight')\n","plt.show()\n","\n","if if_save:\n"," name = 'batch_result, runs=' + str(num_runs) + ', steps=' + str(num_steps)\n"," with open('results/' + '/' + name + '.pickle', 'wb') as handle:\n"," pickle.dump(batch_res, handle, protocol=pickle.HIGHEST_PROTOCOL)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":359,"referenced_widgets":["6574536e49dd498bae5d87ab60144c59","a787648e15174568a65f7b5e17ee43d2","9fccdb73039f4b649f5389aa2b4099ad","701a04ff58fc492f88774aa7139dcbc2","37296861808045328c2c4eb74625987a","8a9c221fcb4a46f9af525b5b0373a598","f155f2ec83cb416d8d375ae77330165b","af831b75ff7146fc99abb8677c84bdf3","8fe71971bf8049bca4a5c6fde2bf7471","9a87fac6283543008f922a57f98b8514","ea8e8fab825a499c8fe628a021b731ca","d2a7f4cc89a44501b6423cff8f76f77d","9231d7a857624fbfa4c6dc1ba3307814","7dbee5d5ef884477be34e5a9889d13b1","ed0108c515b94090bc7ee284284b535b","ef228c5730d943149399ec81f4de4d46","0dd4ce26eb994bf89f9d429982672f1d","3c78bcaf65d745928c7cec9b3618f2f4","3f9147ea50504b5e941cf600259b64c6","3cb22a9a850b42ce8d72132b34cede77","3929bb10e2044d26869495a947ecd340","cf4c98d2628e418b84ef3c798588675a"]},"id":"Vc7uTIz8xARE","executionInfo":{"status":"ok","timestamp":1639148297436,"user_tz":-330,"elapsed":1433361,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"38fb8767-6cf3-41cc-8cd3-1b9abd760ed6"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"6574536e49dd498bae5d87ab60144c59","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/1000 [00:00"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### UCB dynamic by batches"],"metadata":{"id":"82qKEl1F5dMB"}},{"cell_type":"code","source":["model_dir = 'results/UCB/dynamic_by_batches'\n","if not os.path.exists(model_dir):\n"," print(f'Creating a new model directory: {model_dir}')\n"," os.makedirs(model_dir)\n","\n","num_runs = 10 # 500\n","num_steps = 10001\n","seed = None\n","exper_info = {\"num_runs\": num_runs,\n"," \"num_steps\": num_steps,\n"," \"seed\": seed,\n"," \"return_type\": \"regret\"}\n","\n","environments = [[0.7, 0.5], [0.7, 0.4], [0.7, 0.1],\n"," [0.35, 0.18, 0.47, 0.61],\n"," [0.4, 0.75, 0.57, 0.49],\n"," [0.70, 0.50, 0.30, 0.10]]\n","\n","for arms_values in environments:\n"," k = len(arms_values)\n"," reward_type = 'Bernoulli'\n"," env_info = {\"num_actions\": k,\n"," \"reward_type\": reward_type,\n"," \"arms_values\": arms_values}\n"," env = Environment\n"," agent = UCBAgent\n"," alpha = 1\n","\n"," # run online agent\n"," agent_info_online = {\"num_actions\": k, \"batch_size\": 1, \"alpha\": alpha}\n"," experiment = BanditWrapper(env, agent)\n"," online_regret = experiment.get_average_performance(agent_info_online, env_info, exper_info)\n","\n"," # run batch agent\n"," batches = np.logspace(1.0, 3.0, num=20).astype(int)\n"," actual_regret = []\n"," upper_bound = []\n","\n"," for batch in batches:\n"," agent_info_batch = {\"num_actions\": k, \"batch_size\": batch, \"alpha\": alpha}\n"," experiment = BanditWrapper(env, agent)\n"," batch_regret = experiment.get_average_performance(agent_info_batch, env_info, exper_info)\n"," actual_regret.append(batch_regret[-1])\n"," M = int(num_steps / batch)\n"," upper_bound.append(online_regret[M] * batch)\n","\n"," # save data\n"," name = 'dyn_by_batch_' + str(arms_values)\n"," name1 = name + ' batch_regret'\n"," with open(model_dir + '/' + name1 + '.pickle', 'wb') as handle:\n"," pickle.dump(actual_regret, handle, protocol=pickle.HIGHEST_PROTOCOL)\n","\n"," name2 = name + ' online_regret'\n"," with open(model_dir + '/' + name2 + '.pickle', 'wb') as handle:\n"," pickle.dump(online_regret, handle, protocol=pickle.HIGHEST_PROTOCOL)\n","\n","print(\"End!\")"],"metadata":{"id":"L3KoEguL5dIz"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### TS"],"metadata":{"id":"t618mNgBxKKM"}},{"cell_type":"markdown","source":["#### TS dynamic by timesteps"],"metadata":{"id":"oNTgxitH5Dy_"}},{"cell_type":"code","source":["env = Environment\n","agent = TSAgent\n","\n","num_runs = 10 # 1000\n","num_steps = 10000\n","seed = None\n","if_save = False\n","exper_info = {\"num_runs\": num_runs,\n"," \"num_steps\": num_steps,\n"," \"seed\": seed,\n"," \"return_type\": \"regret\"}\n","\n","k = 2\n","arms_values = [0.7, 0.65]\n","reward_type = 'Bernoulli'\n","env_info = {\"num_actions\": k,\n"," \"reward_type\": reward_type,\n"," \"arms_values\": arms_values}\n","\n","# batch-online experiment\n","batch_res = []\n","online_res = []\n","batch = 10\n","agent_info_batch = {\"num_actions\": k, \"batch_size\": batch}\n","agent_info_online = {\"num_actions\": k, \"batch_size\": 1}\n","\n","exp1 = BanditWrapper(env, agent)\n","batch_res.append(exp1.get_average_performance(agent_info_batch, env_info, exper_info))\n","online_res.append(exp1.get_average_performance(agent_info_online, env_info, exper_info))\n","\n","av_online_res = np.mean(online_res, axis=0)\n","av_batch_res = np.mean(batch_res, axis=0)\n","\n","plt.plot(av_batch_res, label='batch')\n","plt.plot(av_online_res, label='online')\n","\n","M = int(num_steps / batch)\n","update_points = np.ceil(np.arange(num_steps) / batch).astype(int)\n","plt.plot(av_online_res[update_points] * batch, ls='--',\n"," label='upper bound, batch size = 10')\n","plt.title('Cumulative Regret averaged over ' + str(num_runs) + ' runs')\n","plt.xlabel('time steps')\n","plt.ylabel('regret')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.legend()\n","if if_save:\n"," plt.savefig('results/TS example.png', bbox_inches='tight')\n","plt.show()\n","\n","if if_save:\n"," name = 'batch_result, runs=' + str(num_runs) + ', steps=' + str(num_steps)\n"," with open('results/' + '/' + name + '.pickle', 'wb') as handle:\n"," pickle.dump(batch_res, handle, protocol=pickle.HIGHEST_PROTOCOL)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":359,"referenced_widgets":["959b3e666a064b6d8917c8625ecd8fee","ba3a1e89d28342f683d0013065137cb2","53079098231c4906af72b59e6773052f","3415712fbd16477b8eb7bf6844c56d51","7269023608aa4b9c833466b4634a02cd","23ca025a590c4caba147cfee82b8fb82","6892149d580c4521bfbc8ce341445d61","0767ce00fdc24b709c3ca2169e13e545","c11a3dcd03f24240826793c233950bea","ff5a4612a01b47a8a805ca8a643956c3","f8e2be434a1846c797556912bad038f1","85a8b0c33c104b8eb22fe9e21dc3d543","f8a6e8d21951434b84789ff596bf188b","3825eaf811174f30b38725c44d1536a6","f0fad1d578be4cb790bcbc91e2088d85","367d61cced8a4b7a9eb3763f11856cce","0655f854114a4705ba29eabd0cc99e31","f06c08cde5e14462a35c9b411e3cb167","d769f331f73d42a1ae05b69c07023890","52ec6649d8e94615bf9397cbd9d85b48","fa0bd788f3a8421d949951e60f790c07","2464f2977ba04e8a855461a081005305"]},"id":"9POfXn2TxLWQ","executionInfo":{"status":"ok","timestamp":1639148363702,"user_tz":-330,"elapsed":55499,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"15423772-d107-4547-f6fa-59c4a54546e3"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"959b3e666a064b6d8917c8625ecd8fee","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/10 [00:00"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### TS dynamic by batches"],"metadata":{"id":"koXASf5O5GR2"}},{"cell_type":"code","source":["model_dir = 'results/TS/dynamic_by_batches'\n","if not os.path.exists(model_dir):\n"," print(f'Creating a new model directory: {model_dir}')\n"," os.makedirs(model_dir)\n","\n","num_runs = 10 # 500\n","num_steps = 10001\n","seed = None\n","exper_info = {\"num_runs\": num_runs,\n"," \"num_steps\": num_steps,\n"," \"seed\": seed,\n"," \"return_type\": \"regret\"}\n","\n","environments = [[0.7, 0.5], [0.7, 0.4], [0.7, 0.1],\n"," [0.35, 0.18, 0.47, 0.61],\n"," [0.4, 0.75, 0.57, 0.49],\n"," [0.70, 0.50, 0.30, 0.10]]\n","\n","for arms_values in environments:\n"," k = len(arms_values)\n"," reward_type = 'Bernoulli'\n"," env_info = {\"num_actions\": k,\n"," \"reward_type\": reward_type,\n"," \"arms_values\": arms_values}\n"," env = Environment\n"," agent = TSAgent\n","\n"," # run online agent\n"," agent_info_online = {\"num_actions\": k, \"batch_size\": 1}\n"," experiment = BanditWrapper(env, agent)\n"," online_regret = experiment.get_average_performance(agent_info_online, env_info, exper_info)\n","\n"," # run batch agent\n"," batches = np.logspace(1.0, 3.0, num=20).astype(int)\n"," actual_regret = []\n"," upper_bound = []\n","\n"," for batch in batches:\n"," agent_info_batch = {\"num_actions\": k, \"batch_size\": batch}\n"," experiment = BanditWrapper(env, agent)\n"," batch_regret = experiment.get_average_performance(agent_info_batch, env_info, exper_info)\n"," actual_regret.append(batch_regret[-1])\n"," M = int(num_steps / batch)\n"," upper_bound.append(online_regret[M] * batch)\n","\n"," # save data\n"," name = 'dyn_by_batch_' + str(k) + str(arms_values)\n"," name1 = name + ' batch_regret'\n"," with open(model_dir + '/' + name1 + '.pickle', 'wb') as handle:\n"," pickle.dump(actual_regret, handle, protocol=pickle.HIGHEST_PROTOCOL)\n","\n"," name2 = name + ' online_regret'\n"," with open(model_dir + '/' + name2 + '.pickle', 'wb') as handle:\n"," pickle.dump(online_regret, handle, protocol=pickle.HIGHEST_PROTOCOL)\n","\n","print(\"End!\")"],"metadata":{"id":"T-CjxemW5GNq"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### LinUCB"],"metadata":{"id":"L-4KgfMU0iE9"}},{"cell_type":"markdown","source":["#### LinUCB by timesteps"],"metadata":{"id":"elLqw6xk4083"}},{"cell_type":"code","source":["num_experiments = 20\n","batch_size = 100\n","data_dir = 'data/mushroom_data_final.pickle'\n","env_info = {'pickle_file': data_dir}\n","output_dir = 'LinUCB/dynamic_by_timesteps'\n","\n","agent_info = {'alpha': 2,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': 1}\n","agent_info_batch = {'alpha': 2,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch_size}\n","experiment_parameters = {\"num_runs\": num_experiments}\n","\n","agent = LinUCBAgent\n","environment = ReplayEnvironment\n","\n","online_result = run_experiment(environment, agent, env_info, agent_info,\n"," experiment_parameters, True, output_dir)\n","batch_result = run_experiment(environment, agent, env_info, agent_info_batch,\n"," experiment_parameters, True, output_dir)\n","\n","smoothed_leveled_result = smooth(online_result, 100)\n","smoothed_leveled_result1 = smooth(batch_result, 100)\n","\n","mean_smoothed_leveled_result = np.mean(smoothed_leveled_result, axis=0)\n","mean_smoothed_leveled_result1 = np.mean(smoothed_leveled_result1, axis=0)\n","\n","num_steps = np.minimum(len(mean_smoothed_leveled_result), len(mean_smoothed_leveled_result1))\n","update_points = np.ceil(np.arange(num_steps) / batch_size).astype(int)\n","\n","pic_filename = \"results/{}/UCB_transform_timesteps.png\".format(output_dir)\n","plt.plot(mean_smoothed_leveled_result1, lw=3, label='batch, batch size = ' + str(batch_size))\n","plt.plot(mean_smoothed_leveled_result, lw=3, ls='-.', label='online policy')\n","plt.plot(mean_smoothed_leveled_result[update_points], lw=3, ls='-.', label='dumb policy')\n","plt.legend()\n","plt.xlabel('time steps')\n","plt.title(\"Smooth Cumulative Reward averaged over {} runs\".format(num_experiments))\n","plt.ylabel('smoothed reward')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.savefig(pic_filename, bbox_inches='tight')\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":359,"referenced_widgets":["07d74cc8c1034e8e88e0ba68681e7d83","20755197a75045769c76c25cf9997309","3aaecc6ab5334dbaaff91f3fd3d2dc92","ccdfd084e55f4d48aa8d62ff900c54dc","602801fccd6d4538bd22a5494c8a538e","81b219b6e4414ff888646a18f038c6d2","4622f6b8c7914be18ec086e119b14510","c603ecbfec974667805abf5f8366dde5","508403ada600443f97467dde6fb0dd3d","9840772f43134cee8eabacd2509f9fd7","4e96a7f4873f4360b2118e7a3ddbfc48","c19256a397ea4e79b3a0cbf5a424a3ea","4d1f5676bbaa4b3d8b81cc7be3cf6da3","eae2220f0119401a8759637bcf0e9f4c","4aa44dd37d5243dfa24fea8f3dc6839b","2deab0a58cd04226b834a99ee4ff4c90","16acd859901c4b8aa5f6b4473b74e249","e4edb80a747a4e9684a556ff96563e7f","3d74bbdd72dc4e0aadb4bd517358bbe7","809de5d470244a2b90daffd0477c28a4","4e13cae2ba7a44daa51794431d7af0c0","2780d1d40a0644c498e860cf4839ac25"]},"id":"tXey4Vyi06pm","executionInfo":{"status":"ok","timestamp":1639148649109,"user_tz":-330,"elapsed":32385,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"77e181e9-b27e-474c-834d-4db5a099aeb1"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"07d74cc8c1034e8e88e0ba68681e7d83","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/20 [00:00"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### LinUCB by batches"],"metadata":{"id":"q7xl1u_F45d5"}},{"cell_type":"code","source":["num_experiments = 20\n","data_dir = 'data/mushroom_data_final.pickle'\n","env_info = {'pickle_file': data_dir}\n","output_dir = 'LinUCB/dynamic_by_batches'\n","\n","agent_info = {'alpha': 2,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': 1}\n","experiment_parameters = {\"num_runs\": num_experiments}\n","\n","agent = LinUCBAgent\n","environment = ReplayEnvironment\n","\n","# run online agent\n","online_result = run_experiment(environment, agent, env_info, agent_info,\n"," experiment_parameters, True, output_dir)\n","# smooth and average the result\n","smoothed_leveled_result = smooth(online_result, 100)\n","mean_smoothed_leveled_result = np.mean(smoothed_leveled_result, axis=0)\n","mean_smoothed_leveled_result = mean_smoothed_leveled_result[~np.isnan(mean_smoothed_leveled_result)]\n","\n","# run batch agent\n","batch_sizes = np.logspace(1.0, 2.7, num=20).astype(int)\n","actual_regret = []\n","upper_bound = []\n","for batch in batch_sizes:\n"," agent_info_batch = {'alpha': 2,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch}\n"," batch_result = run_experiment(environment, agent, env_info, agent_info_batch,\n"," experiment_parameters, True, output_dir)\n"," # smooth and average the result\n"," smoothed_leveled_result1 = smooth(batch_result, 100)\n"," mean_smoothed_leveled_result1 = np.mean(smoothed_leveled_result1, axis=0)\n"," mean_smoothed_leveled_result1 = mean_smoothed_leveled_result1[~np.isnan(mean_smoothed_leveled_result1)]\n","\n"," actual_regret.append(mean_smoothed_leveled_result1[-1])\n","\n"," # fetch dumb result\n"," M = int(len(mean_smoothed_leveled_result1) / batch)\n"," upper_bound.append(mean_smoothed_leveled_result[M])\n","\n","pic_filename = \"results/{}/UCB_transform_batchsize.png\".format(output_dir)\n","plt.plot(batch_sizes, actual_regret, label='actual regret')\n","plt.plot(batch_sizes, [mean_smoothed_leveled_result[-1]]*len(batch_sizes), label='online policy')\n","plt.plot(batch_sizes, upper_bound, label='dumb policy')\n","plt.legend()\n","plt.title(\"Reward as a f-n of batch size (each point is averaged over {} runs)\".format(num_experiments))\n","plt.xlabel('batch size (log scale)')\n","plt.ylabel('reward')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.savefig(pic_filename, bbox_inches='tight')\n","plt.show()"],"metadata":{"id":"XxBGmxib45aV"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### LinTS"],"metadata":{"id":"zaZs-8O31BHz"}},{"cell_type":"markdown","source":["#### LinTS by timesteps"],"metadata":{"id":"apXIaCEY4nih"}},{"cell_type":"code","source":["num_experiments = 10\n","batch_size = 100\n","data_dir = 'data/mushroom_data_final.pickle'\n","env_info = {'pickle_file': data_dir}\n","output_dir = 'LinTS/dynamic_by_timesteps'\n","\n","agent_info = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': 1,\n"," 'replay_buffer_size': 100000}\n","agent_info_batch = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch_size,\n"," 'replay_buffer_size': 100000}\n","experiment_parameters = {\"num_runs\": num_experiments}\n","\n","agent = LinTSAgent\n","environment = ReplayEnvironment\n","\n","online_result = run_experiment(environment, agent, env_info, agent_info,\n"," experiment_parameters, True, output_dir)\n","batch_result = run_experiment(environment, agent, env_info, agent_info_batch,\n"," experiment_parameters, True, output_dir)\n","\n","smoothed_leveled_result = smooth(online_result, 100)\n","smoothed_leveled_result1 = smooth(batch_result, 100)\n","\n","mean_smoothed_leveled_result = np.mean(smoothed_leveled_result, axis=0)\n","mean_smoothed_leveled_result1 = np.mean(smoothed_leveled_result1, axis=0)\n","\n","num_steps = np.minimum(len(mean_smoothed_leveled_result), len(mean_smoothed_leveled_result1))\n","update_points = np.ceil(np.arange(num_steps) / batch_size).astype(int)\n","\n","pic_filename = \"results/{}/TS_transform_timesteps.png\".format(output_dir)\n","plt.plot(mean_smoothed_leveled_result1, lw=3, label='batch, batch size = ' + str(batch_size))\n","plt.plot(mean_smoothed_leveled_result, lw=3, ls='-.', label='online policy')\n","plt.plot(mean_smoothed_leveled_result[update_points], lw=3, ls='-.', label='dumb policy')\n","plt.legend()\n","plt.xlabel('time steps')\n","plt.title(\"Smooth Cumulative Reward averaged over {} runs\".format(num_experiments))\n","plt.ylabel('smoothed reward')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.savefig(pic_filename, bbox_inches='tight')\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":359,"referenced_widgets":["a2c68a56898548f8a7e190dcf2d034f4","e009631910e042a2a07afe8cf0e6d118","a850623290b14d07838e4203a29f9ba2","9f140b090cb44361b39a6e09205c087c","36fc4560cb99439c945c620138005a1b","638ee1bca5d64cc7966556e3fb64c06e","a454e1e1460046e3a98a4b28c48ecda0","d0a15e2054af430bad52b6fc28fd0994","f9295dd431fe4587a816d6c59f464399","41ca699547f14bda8a83777d78e6bc86","c29bc574f0cd46309d8eb6ec40378025","858e460d943744248a4109a5c328d77c","700c0953693b48bea968c6c67964684d","c70158af000c40e59b588e745be4a2dd","21b1b038a25f469295ea8e2b75c470ae","c20bc14a583e452ba263c4e4f4f3147e","e1199401ceee4d0ca1aaa72020618241","57b794458691470ba34efd35f0cd8a9c","4bd9a0cc11664bf4870c7fc46d151bda","301a50e882864065b9108e0a0cf0edde","93f8c74e75504aadbf1cdec1c5b6a43f","a4d3c862e74242e4beeaaa880f4e3fc8"]},"id":"6uyZk7PT1Cjy","executionInfo":{"status":"ok","timestamp":1639149620282,"user_tz":-330,"elapsed":952413,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"72dd4d89-25ac-408a-c033-d05d6bee7628"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"a2c68a56898548f8a7e190dcf2d034f4","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/10 [00:00"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### LinTS by batches"],"metadata":{"id":"pVbE43Lm4p5H"}},{"cell_type":"code","source":["num_experiments = 20\n","data_dir = 'data/mushroom_data_final.pickle'\n","env_info = {'pickle_file': data_dir}\n","output_dir = 'LinTS/dynamic_by_batches'\n","\n","agent_info = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': 1,\n"," 'replay_buffer_size': 100000}\n","experiment_parameters = {\"num_runs\": num_experiments}\n","\n","agent = LinTSAgent\n","environment = ReplayEnvironment\n","\n","# run online agent\n","online_result = run_experiment(environment, agent, env_info, agent_info,\n"," experiment_parameters, True, output_dir)\n","# smooth and average the result\n","smoothed_leveled_result = smooth(online_result, 100)\n","mean_smoothed_leveled_result = np.mean(smoothed_leveled_result, axis=0)\n","mean_smoothed_leveled_result = mean_smoothed_leveled_result[~np.isnan(mean_smoothed_leveled_result)]\n","\n","# run batch agent\n","batch_sizes = np.logspace(1.0, 2.7, num=20).astype(int)\n","actual_regret = []\n","upper_bound = []\n","for batch in batch_sizes:\n"," agent_info_batch = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch,\n"," 'replay_buffer_size': 100000}\n"," batch_result = run_experiment(environment, agent, env_info, agent_info_batch,\n"," experiment_parameters, True, output_dir)\n"," # smooth and average the result\n"," smoothed_leveled_result1 = smooth(batch_result, 100)\n"," mean_smoothed_leveled_result1 = np.mean(smoothed_leveled_result1, axis=0)\n"," mean_smoothed_leveled_result1 = mean_smoothed_leveled_result1[~np.isnan(mean_smoothed_leveled_result1)]\n","\n"," actual_regret.append(mean_smoothed_leveled_result1[-1])\n","\n"," # fetch dumb result\n"," M = int(len(mean_smoothed_leveled_result1) / batch)\n"," upper_bound.append(mean_smoothed_leveled_result[M])\n","\n","pic_filename = \"results/{}/TS_transform_batchsize.png\".format(output_dir)\n","plt.plot(batch_sizes, actual_regret, label='actual regret')\n","plt.plot(batch_sizes, [mean_smoothed_leveled_result[-1]]*len(batch_sizes), label='online policy')\n","plt.plot(batch_sizes, upper_bound, label='dumb policy')\n","plt.legend()\n","plt.title(\"Reward as a f-n of batch size (each point is averaged over {} runs)\".format(num_experiments))\n","plt.xlabel('batch size (log scale)')\n","plt.ylabel('reward')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.savefig(pic_filename, bbox_inches='tight')\n","plt.show()"],"metadata":{"id":"K63E-61k4p03"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### CMAB demo on Mushroom dataset"],"metadata":{"id":"w5S8ABzm1JMM"}},{"cell_type":"code","source":["data_dir = 'data/mushroom_data_final.pickle'\n","env_info = {'pickle_file': data_dir,\n"," 'seed': 1}\n","# init env\n","environment = ReplayEnvironment\n","\n","# init random agent\n","random_agent_info = {'num_actions': 2}\n","ra = RandomAgent()\n","ra.agent_init(random_agent_info)\n","\n","# learn LinUCB agent\n","agent_info = {'alpha': 2,\n"," 'num_actions': 2,\n"," 'seed': 1,\n"," 'batch_size': 1}\n","\n","agent = LinUCBAgent\n","rl_glue = RLGlue(environment, agent)\n","\n","for i in range(4): \n"," rl_glue.rl_init(agent_info, env_info)\n"," rl_glue.rl_episode(0)\n","UCB_agent = rl_glue.agent\n","\n","# learn LinTS agent\n","agent_info = {'num_actions': 2,\n"," 'replay_buffer_size': 200,\n"," 'seed': 1,\n"," 'batch_size': 1}\n","agent = LinTSAgent\n","rl_glue = RLGlue(environment, agent)\n","\n","for i in range(4): \n"," rl_glue.rl_init(agent_info, env_info)\n"," rl_glue.rl_episode(0)\n","\n","TS_agent = rl_glue.agent\n","result = []\n","result1 = []\n","result2 = []\n","\n","exper_seeds = [2, 5, 10, 12, 54, 32, 15, 76, 45, 56]\n","for seed_ in exper_seeds:\n"," dataset = BanditDataset(pickle_file=data_dir, seed=seed_)\n","\n"," eval_info = {'dataset': dataset, 'agent': UCB_agent}\n"," eval_info1 = {'dataset': dataset, 'agent': TS_agent}\n"," eval_info2 = {'dataset': dataset, 'agent': ra}\n","\n"," evaluator = OfflineEvaluator(eval_info)\n"," evaluator1 = OfflineEvaluator(eval_info1)\n"," evaluator2 = OfflineEvaluator(eval_info2)\n","\n"," reward = evaluator.eval_run()\n"," reward1 = evaluator1.eval_run()\n"," reward2 = evaluator2.eval_run()\n","\n"," result.append(reward)\n"," result1.append(reward1)\n"," result2.append(reward2)\n","\n","labels = ['UCB agent', 'TS agent', 'Random agent']\n","for i, res in enumerate([result, result1, result2]):\n"," for elem in res:\n"," plt.plot(elem, linewidth=0.1)\n"," avg = [float(sum(col))/len(col) for col in zip(*res)]\n"," plt.plot(avg, label=labels[i])"],"metadata":{"id":"pHKrIm_Q1R7S"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["labels = ['UCB agent', 'TS agent', 'Random agent']\n","for i, res in enumerate([result, result1, result2]):\n"," for elem in res:\n"," plt.plot(elem, linewidth=0.1)\n"," avg = [float(sum(col))/len(col) for col in zip(*res)]\n"," plt.plot(avg, label=labels[i])\n","plt.legend()\n","plt.ylim([0.1, 0.7])\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":269},"id":"ZbxPyHo_1Zgo","executionInfo":{"status":"ok","timestamp":1639152031963,"user_tz":-330,"elapsed":1780,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"0b963035-788e-4b43-b73d-9ee1df8e7cc7"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["### CMAB demo on Simulated dataset"],"metadata":{"id":"o_S529BK1qop"}},{"cell_type":"code","source":["# generate 100 000 samples with 4 features and 3 actions\n","dataset = generate_samples(100000, 4, 3, True)\n","dataset.head()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":206},"id":"8OOtls5G1qlT","executionInfo":{"status":"ok","timestamp":1639149837227,"user_tz":-330,"elapsed":4833,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"597535e2-9ebb-4bce-a443-6c90344656dc"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
X_1X_2X_3X_4ayprobs
013000.00.00.266661
131311.00.00.236514
230011.00.00.236514
303101.00.00.236514
421200.00.00.266661
\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":71}]},{"cell_type":"markdown","source":["#### LinTS dynamic by steps"],"metadata":{"id":"h9x6zOMx1qdr"}},{"cell_type":"code","source":["num_experiments = 10\n","batch_size1 = 30\n","batch_size2 = 100\n","env_info = {'pickle_file': dataset}\n","\n","agent1_info = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch_size1,\n"," 'replay_buffer_size': 100000}\n","agent2_info = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch_size2,\n"," 'replay_buffer_size': 100000}\n","experiment_parameters = {\"num_runs\": num_experiments}"],"metadata":{"id":"SDmmh_Js1qag"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["agent = LinTSAgent\n","environment = ReplayEnvironment\n","\n","result1 = run_experiment(environment, agent, env_info, agent1_info, experiment_parameters, False)\n","result2 = run_experiment(environment, agent, env_info, agent2_info, experiment_parameters, False)\n","\n","smoothed_leveled_result1 = smooth(result1, 100)\n","smoothed_leveled_result2 = smooth(result2, 100)\n","\n","mean_smoothed_leveled_result1 = np.mean(smoothed_leveled_result1, axis=0)\n","mean_smoothed_leveled_result2 = np.mean(smoothed_leveled_result2, axis=0)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":81,"referenced_widgets":["79e9b193d9284e4b898cb4344db92ef3","8ea51857d7cf48c1beddb0a9bd3b764b","7b0e4960186b4307ae594b269043c16d","aa39361015a84c158e922f8e0b8dca9a","63acbf6a68e6455c91cbea40169d1ee9","e2c2139f96b345768e075ef3593fac06","3dcbffa6176e4824b9a48cccfaf024cc","740c9d9905b542d4a0edef78f1d8ca30","cd2dc9d9c7504cd4b118a33b7c24f683","33707c49e4fd42ad932dd74e59f4a060","60745768aedc4942bad8883d708b0e25","48077097754d4b96b1345fb1c06560b8","760943cea30f4236a0715b61a047fd99","3bf9f4be47424b13b1db937f67894360","28c1b766f56c41179840f2140da35b44","487beca1cfc847c0a41a414968097b6b","c28b5aecd2eb4353b99534e8eef2380c","f167c63d8ac54b07b31b261c77a98391","4a8e550188ac481fa2838df0996d3b0b","50dfc1413ebd4298af9fc979de4ebb63","f36eb7ce107741159cfc86169724580f","5b4edf526246433d8cca04eba8be3229"]},"id":"Sp9wGAPS1-V-","executionInfo":{"status":"ok","timestamp":1639150020202,"user_tz":-330,"elapsed":182996,"user":{"displayName":"Sparsh Agarwal","photoUrl":"https://lh3.googleusercontent.com/a/default-user=s64","userId":"13037694610922482904"}},"outputId":"b1fc5a37-fb85-44dc-cb62-57e3a9813b63"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"79e9b193d9284e4b898cb4344db92ef3","version_minor":0,"version_major":2},"text/plain":[" 0%| | 0/10 [00:00"]},"metadata":{"needs_background":"light"}}]},{"cell_type":"markdown","source":["#### LinTS dynamic by batches"],"metadata":{"id":"B3W58Zqv2CnH"}},{"cell_type":"code","source":["num_experiments = 20\n","env_info = {'pickle_file': dataset}\n","experiment_parameters = {\"num_runs\": num_experiments}\n","\n","agent = LinTSAgent\n","environment = ReplayEnvironment\n","\n","# run batch agent\n","batch_sizes = np.logspace(1.0, 2.7, num=20).astype(int)\n","actual_regret = []\n","for batch in batch_sizes:\n"," agent_info_batch = {'alpha': 1,\n"," 'num_actions': 3,\n"," 'seed': 1,\n"," 'batch_size': batch,\n"," 'replay_buffer_size': 100000}\n"," batch_result = run_experiment(environment, agent, env_info, agent_info_batch,\n"," experiment_parameters, False)\n"," # smooth and average the result\n"," smoothed_leveled_result1 = smooth(batch_result, 100)\n"," mean_smoothed_leveled_result1 = np.mean(smoothed_leveled_result1, axis=0)\n"," mean_smoothed_leveled_result1 = mean_smoothed_leveled_result1[~np.isnan(mean_smoothed_leveled_result1)]\n","\n"," actual_regret.append(mean_smoothed_leveled_result1[-1])"],"metadata":{"id":"Vs_O6HE92Ckv"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["plt.plot(batch_sizes, actual_regret, label='actual regret')\n","plt.legend()\n","plt.title(\"Reward as a f-n of batch size (each point is averaged over {} runs)\".format(num_experiments))\n","plt.xlabel('batch size (log scale)')\n","plt.ylabel('reward')\n","plt.grid(b=True, which='major', linestyle='--', alpha=0.5)\n","plt.minorticks_on()\n","plt.grid(b=True, which='minor', linestyle=':', alpha=0.2)\n","plt.show()"],"metadata":{"id":"4iErUrNt2CiB"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":[""],"metadata":{"id":"ajBoPT1U2CfL"},"execution_count":null,"outputs":[]}]}