{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"RELEVANT_BUILDINGS = [\n '5d27096c03f801723c31e5e0',\n '5d2709d403f801723c32bd39',\n '5da958dd46f8266d0737457b',\n '5dbc1d84c1eb61796cf7c010',\n '5da138764db8ce0c98bcaa46',\n '5dc8cea7659e181adb076a3f',\n '5d2709bb03f801723c32852c',\n '5d2709e003f801723c32d896',\n '5d2709c303f801723c3299ee',\n '5d2709b303f801723c327472',\n '5a0546857ecc773753327266',\n '5da138b74db8ce0c98bd4774',\n '5da1383b4db8ce0c98bc11ab',\n '5da138754db8ce0c98bca82f',\n '5d2709a003f801723c3251bf',\n '5d27097f03f801723c320d97',\n '5da138314db8ce0c98bbf3a0',\n '5da1389e4db8ce0c98bd0547',\n '5da1382d4db8ce0c98bbe92e',\n '5da138364db8ce0c98bc00f1',\n '5da138274db8ce0c98bbd3d2',\n '5d27099f03f801723c32511d',\n '5d27075f03f801723c2e360f',\n '5c3c44b80379370013e0fd2b',\n]\n\nALL_BUILDINGS = ['5cd56c0ce2acfd2d33b6ab27', '5cdbc652853bc856e89a8694', '5cd969ba39e2fc0b4afe6faf', '5cd969d339e2fc0b4afe90f4', '5cd969e439e2fc0b4afea869', '5cd56b5ae2acfd2d33b58544', '5cd56c01e2acfd2d33b698ba', '5da138764db8ce0c98bcaa46', '5cd56ba1e2acfd2d33b603af', '5cd56b90e2acfd2d33b5e33f', '5cd969b639e2fc0b4afe6db1', '5cd56c29e2acfd2d33b6d915', '5cd56b96e2acfd2d33b5ef90', '5cdac626e403deddaf46810d', '5cd969f339e2fc0b4afebbd0', '5cd56ba5e2acfd2d33b60e03', '5cd969be39e2fc0b4afe732b', '5cd56bb7e2acfd2d33b62f0b', '5da138754db8ce0c98bca82f', '5d2709b303f801723c327472', '5d27099f03f801723c32511d', '5cd969ba39e2fc0b4afe6fae', '5cd56bfce2acfd2d33b6906e', '5d27097f03f801723c320d97', '5cd56b89e2acfd2d33b5d759', '5cd969b639e2fc0b4afe6db2', '5cd56bc1e2acfd2d33b6404d', '5cd56ba1e2acfd2d33b60565', '5cd56c1ee2acfd2d33b6cdf4', '5cdac620e403deddaf467fdb', '5cd56c1be2acfd2d33b6c766', '5cdac61de403deddaf467f30', '5da138b74db8ce0c98bd4774', '5cd56b7de2acfd2d33b5c14b', '5cd96a0039e2fc0b4afecf51', '5cd56b64e2acfd2d33b59246', '5cdac625e403deddaf4680c9', '5cd56baee2acfd2d33b61a93', '5cdac622e403deddaf46805a', '5cd969bc39e2fc0b4afe71ac', '5cd56bd9e2acfd2d33b662df', '5cdac622e403deddaf46803a', '5cd56bdbe2acfd2d33b663c0', '5cd56b9be2acfd2d33b5fa9d', '5cd56b99e2acfd2d33b5f491', '5cd969bb39e2fc0b4afe7079', '5cd969c839e2fc0b4afe7ff0', '5cd969c339e2fc0b4afe7778', '5cd56c18e2acfd2d33b6c321', '5cd969c339e2fc0b4afe7775', '5cd969bc39e2fc0b4afe71ad', '5cd56c11e2acfd2d33b6b3c8', '5cd56b91e2acfd2d33b5e466', '5cdac61ee403deddaf467f5c', '5cd969f539e2fc0b4afebd85', '5cd969db39e2fc0b4afe9bc2', '5da1383b4db8ce0c98bc11ab', '5cd56b89e2acfd2d33b5d75a', '5cd969ed39e2fc0b4afeb295', '5cd56babe2acfd2d33b61827', '5cd56bb9e2acfd2d33b633ea', '5da138274db8ce0c98bbd3d2', '5cd969d639e2fc0b4afe9583', '5cd56b6fe2acfd2d33b5a386', '5cd56c1ce2acfd2d33b6c8bf', '5cd56b86e2acfd2d33b5cf97', '5cdac626e403deddaf4680ef', '5cdac61de403deddaf467f4f', '5cd56b8be2acfd2d33b5db68', '5cd969ef39e2fc0b4afeb42e', '5cd56b9be2acfd2d33b5f99e', '5cd56c0ae2acfd2d33b6a8d0', '5cd56b6ae2acfd2d33b59ccb', '5d2709bb03f801723c32852c', '5cdac625e403deddaf4680d2', '5cd969be39e2fc0b4afe732d', '5cd969b539e2fc0b4afe6bf5', '5a0546857ecc773753327266', '5cd56bc2e2acfd2d33b64221', '5cd56b5ae2acfd2d33b5854a', '5cd56be5e2acfd2d33b66e3f', '5cdac61fe403deddaf467fac', '5cd56b5ae2acfd2d33b58549', '5cdac625e403deddaf4680e6', '5cd56b89e2acfd2d33b5d61e', '5cd56bbde2acfd2d33b639b4', '5d2709d403f801723c32bd39', '5cd56c0ee2acfd2d33b6b000', '5cd56b6ee2acfd2d33b5a247', '5cd56b79e2acfd2d33b5b77c', '5cd56bb5e2acfd2d33b62b37', '5cd56b91e2acfd2d33b5e4b1', '5cd969fd39e2fc0b4afeca61', '5cd969d139e2fc0b4afe8cad', '5cd56be4e2acfd2d33b66da1', '5cdac61ee403deddaf467f6b', '5cd56b83e2acfd2d33b5cab0', '5cd56c21e2acfd2d33b6d398', '5da958dd46f8266d0737457b', '5cd969fc39e2fc0b4afec868', '5da1389e4db8ce0c98bd0547', '5cd56b77e2acfd2d33b5b310', '5cd969c739e2fc0b4afe7d60', '5cd56c1ce2acfd2d33b6ca5b', '5d2709c303f801723c3299ee', '5cdac61fe403deddaf467fb5', '5cd56c11e2acfd2d33b6b413', '5cdac621e403deddaf468026', '5cd56bc2e2acfd2d33b640cc', '5cd56c03e2acfd2d33b69c1f', '5cd56b70e2acfd2d33b5a44e', '5cd56ba1e2acfd2d33b60373', '5cd969e039e2fc0b4afea1fe', '5cd56b67e2acfd2d33b596bd', '5cd56c1ee2acfd2d33b6ceab', '5cd56ba0e2acfd2d33b600ed', '5d27099303f801723c32364d', '5d27096c03f801723c31e5e0', '5cdac626e403deddaf468102', '5cd96a0239e2fc0b4afed11f', '5cd96a0139e2fc0b4afed076', '5cdac624e403deddaf4680b3', '5cd56c17e2acfd2d33b6c161', '5cd969ef39e2fc0b4afeb42f', '5cd56b96e2acfd2d33b5ef55', '5cd96a0239e2fc0b4afed11e', '5cd56bcbe2acfd2d33b6526b', '5cd56c10e2acfd2d33b6b37f', '5cd56b8de2acfd2d33b5dd26', '5d2709e003f801723c32d896', '5da138314db8ce0c98bbf3a0', '5cd969c839e2fc0b4afe7ff1', '5cd56b61e2acfd2d33b58d20', '5cdac621e403deddaf468018', '5cd96a0139e2fc0b4afed075', '5cd56c16e2acfd2d33b6bd44', '5cd56c10e2acfd2d33b6b348', '5cd969ae39e2fc0b4afe68c4', '5cdac625e403deddaf4680db', '5cd56b9de2acfd2d33b5fc50', '5cd56b63e2acfd2d33b591c2', '5cd969dd39e2fc0b4afe9ee3', '5cd56c0ce2acfd2d33b6acc5', '5cdac624e403deddaf4680c2', '5d2709a003f801723c3251bf', '5da1382d4db8ce0c98bbe92e', '5cd969ad39e2fc0b4afe67ec', '5cd56b5ae2acfd2d33b58546', '5cd56b6be2acfd2d33b59d1f', '5cd969ad39e2fc0b4afe67ed', '5cd56b75e2acfd2d33b5af29', '5cd56babe2acfd2d33b61826', '5cd56bd8e2acfd2d33b66008', '5cd56bc4e2acfd2d33b6455c', '5cd56bc0e2acfd2d33b63f9b', '5cd56bf8e2acfd2d33b689cf', '5cd56bace2acfd2d33b618fe', '5cd56c1ce2acfd2d33b6ca93', '5cd56c17e2acfd2d33b6c19b', '5cdac627e403deddaf468129', '5d27075f03f801723c2e360f', '5dc8cea7659e181adb076a3f', '5dbc1d84c1eb61796cf7c010', '5cdac61de403deddaf467f48', '5cd56bb5e2acfd2d33b62b23', '5cd56865eb294480de7167b6', '5cd56b6ae2acfd2d33b59ccc', '5cd56babe2acfd2d33b617e3', '5cd969bd39e2fc0b4afe727d', '5cd969ea39e2fc0b4afeaef3', '5cdac626e403deddaf4680f4', '5cd56b64e2acfd2d33b5932f', '5cd56c09e2acfd2d33b6a75b', '5cd56b96e2acfd2d33b5ef8f', '5cd56bd7e2acfd2d33b65f05', '5cdac620e403deddaf467ff9', '5cd56b76e2acfd2d33b5b0be', '5da138364db8ce0c98bc00f1', '5cdac620e403deddaf467fc0', '5cd56be4e2acfd2d33b66d0e', '5d2709dd03f801723c32cfb6', '5cd56be3e2acfd2d33b66bae', '5cd56c27e2acfd2d33b6d4c3', '5cd56bb2e2acfd2d33b62663', '5cd969f139e2fc0b4afeb794', '5cd56b77e2acfd2d33b5b22b', '5cdac621e403deddaf46800f', '5cd969d539e2fc0b4afe92f1', '5c3c44b80379370013e0fd2b', '5cd56b5ae2acfd2d33b58548', '5cd56bade2acfd2d33b61a61', '5cdac61fe403deddaf467f91', '5cd56b9be2acfd2d33b5fa12', '5cd56b64e2acfd2d33b592b3', '5cd56b6ae2acfd2d33b59c90', '5cd56b79e2acfd2d33b5b74e', '5cd969b839e2fc0b4afe6edc', '5cd56c28e2acfd2d33b6d7f3', '5cd969ae39e2fc0b4afe68c3', '5cd56ba1e2acfd2d33b60372', '5cd56bd6e2acfd2d33b65dca', '5cd969f239e2fc0b4afeb9cd', '5cd56b91e2acfd2d33b5e4b2', '5cd56b70e2acfd2d33b5a552']\n\n\nFLOOR_MAP = {\"B3\": -3, \"B2\": -2, \"B1\": -1, \"F1\": 0, \"F2\": 1, \"F3\": 2, \"F4\": 3, \"F5\": 4, \"F6\": 5, \"F7\": 6, \"F8\": 7, \"F9\": 8, \"F10\": 9, \"F11\": 10,\n             \"3B\": -3, \"2B\": -2, \"1B\": -1, \"1F\": 0, \"2F\": 1, \"3F\": 2, \"4F\": 3, \"5F\": 4, \"6F\": 5, \"7F\": 6, \"8F\": 7, \"9F\": 8, \"10F\": 9, \"11F\": 10,\n                     \"LG2\": -2, \"LG1\": -1, \"L1\": 0, \"L2\": 1, \"L3\": 2, \"L4\": 3, \"L5\": 4, \"L6\": 5, \"L7\": 6, \"L8\": 7, \"L9\": 8, \"L10\": 9, \"L11\": 10,}\n\ndef is_interactive():\n    return 'runtime' in get_ipython().config.IPKernelApp.connection_file\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import re\nimport os\nimport pandas as pd\nimport numpy as np\ndef extract_trajectory(trajectory_path):\n    wifi_logs = []\n    waypoint_logs = []\n    ssid_logs = set()\n    bssid_logs = set()\n    with open(trajectory_path) as f:\n        floor_name = os.path.basename(os.path.dirname(trajectory_path))\n        try:\n            level = FLOOR_MAP[floor_name]\n        except:\n            level = None\n        line = f.readline()\n        while line:\n            # see https://github.com/location-competition/indoor-location-competition-20\n            waypoint_match = re.findall(r\"(\\d{13})\\tTYPE_WAYPOINT\\t(\\d+.\\d+)\\t(\\d+.\\d+)\", line)\n            if waypoint_match:\n                waypoint_logs.append((int(waypoint_match[0][0]), float(waypoint_match[0][1]), float(waypoint_match[0][2])))\n            wifi_match = re.findall(r\"(\\d{13})\\tTYPE_WIFI\\t(\\w{40})\\t(\\w{40})\\t(-\\d+)\\t(\\d+)\\t\\d+\", line)\n            if wifi_match:\n                wifi_logs.append((int(wifi_match[0][0]), wifi_match[0][1], wifi_match[0][2], int(wifi_match[0][3]), int(wifi_match[0][4])))\n                ssid_logs.add(wifi_match[0][1])\n                bssid_logs.add(wifi_match[0][2])\n            line = f.readline()\n    \n    wifi_pointer, waypoint_pointer = 0, 0\n    while wifi_pointer < len(wifi_logs) and waypoint_pointer < len(waypoint_logs) - 1:\n#         import pdb; pdb.set_trace()\n        t_wifi = int(wifi_logs[wifi_pointer][0])\n        t0, x0, y0 = waypoint_logs[waypoint_pointer]\n        t1, x1, y1 = waypoint_logs[waypoint_pointer + 1]\n        if t_wifi <= t1:\n            t_percent = (t_wifi-t0) / (t1-t0)\n            x, y = x0 + t_percent * (x1 - x0), y0 + t_percent * (y1 - y0)\n            wifi_logs[wifi_pointer] += (x, y, level)\n            wifi_pointer += 1\n        else:\n            waypoint_pointer += 1\n    for waypoint_pointer in range(len(waypoint_logs) - 1):\n        t0, x0, y0 = waypoint_logs[waypoint_pointer]\n        t1, x1, y1 = waypoint_logs[waypoint_pointer + 1]\n        waypoint_logs[waypoint_pointer] += (((y1 - y0)**2 + (x1 - x0)**2)**.5 * 1000 / (t1 - t0),)\n    \n    df_wifi_columns = (\"t\", \"ssid\", \"bssid\", \"rssi\", \"frq\", \"x\", \"y\", \"z\")\n    try:\n        df_wifi = pd.DataFrame(wifi_logs, columns=df_wifi_columns)\n    except Exception as e:\n#         print(\"Handled Error: \", e)\n        try:\n            df_wifi = pd.DataFrame(wifi_logs, columns=df_wifi_columns[:-3])\n        except Exception as e:\n            print(\"Handled also: \", e)\n            df_wifi = pd.DataFrame(wifi_logs)\n    return {\n        \"waypoint\": pd.DataFrame(waypoint_logs, columns=(\"t\", \"x\", \"y\", \"v\")), \n        \"wifi\": df_wifi,\n        \"ssid\": ssid_logs,\n        \"bssid\": bssid_logs,\n    }\n\n\ndef get_building_id(path): \n    with open(path) as f:\n        next(f) # first line can be skipped\n        return re.findall(r\"SiteID:(\\w*)\", next(f))[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# tr = extract_trajectory(\"/kaggle/input/indoor-location-navigation/train/5da138764db8ce0c98bcaa46/F4/5dabfac518410e00067e70a6.txt\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import json\ntrain_dir = '/kaggle/input/indoor-location-navigation/train'\nno_train_files = len([filename for _, _, filenames in os.walk(train_dir) for filename in filenames])\ncounter = 0\ncounter_nonskipped = 0\n\nmy_building = {}\ndimensions = {building_id: {} for building_id in ALL_BUILDINGS}\nfor dirname, _, filenames in os.walk(train_dir):\n    for filename in filenames:\n        counter += 1\n        trajectory_id = filename.split(\".\")[0]\n        floor_name = os.path.basename(dirname)\n        building_id = os.path.basename(os.path.dirname(dirname))\n#         if building_id not in RELEVANT_BUILDINGS and building_id != '5d27096c03f801723c31e5e0':\n#             continue\n        counter_nonskipped += 1\n        if floor_name not in dimensions[building_id]:\n            dimensions[building_id][floor_name] = (10000, -10000, 10000, -10000)\n        if floor_name not in my_building:\n            my_building[floor_name] = []\n        print(f\"TRN{counter}/{no_train_files} Bldng: {building_id}, Flr: {floor_name}, Trj: {trajectory_id}\")\n        trajectory = extract_trajectory(os.path.join(dirname, filename))\n        dimensions[building_id][floor_name] = (\n            min(dimensions[building_id][floor_name][0], min(trajectory[\"waypoint\"].x)), \n            max(dimensions[building_id][floor_name][1], max(trajectory[\"waypoint\"].x)), \n            min(dimensions[building_id][floor_name][2], min(trajectory[\"waypoint\"].y)), \n            max(dimensions[building_id][floor_name][3], max(trajectory[\"waypoint\"].y)))\n        trajectory_dir = f\"/kaggle/working/train/{building_id}/{floor_name}/{trajectory_id}/\"\n        os.makedirs(trajectory_dir, exist_ok=True)\n        trajectory[\"waypoint\"].to_csv(f\"{trajectory_dir}waypoint.csv\", header=True, index=False)\n        trajectory[\"wifi\"].to_csv(f\"{trajectory_dir}wifi.csv\", header=True, index=False)\n        my_building[floor_name].append(trajectory[\"waypoint\"])\n#         if is_interactive() and counter_nonskipped > 10:\n#             break\n\n#     if is_interactive() and counter_nonskipped > 10:\n#         break\n\nwith open(\"./dimension.txt\", \"w\") as f:\n    print(\"Dimensions:\", dimensions)\n    json.dump(dimensions, f)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import json\n# import collections\n# test_dir = '/kaggle/input/indoor-location-navigation/test'\n# no_test_files = len([filename for _, _, filenames in os.walk(test_dir) for filename in filenames])\n# counter = 0\n\n# ssids = {}\n# bssids = {}\n\n# for dirname, _, filenames in os.walk(test_dir):\n#     for filename in filenames:\n#         counter += 1\n#         trajectory_path = os.path.join(dirname, filename)\n#         trajectory_id = filename.split(\".\")[0]\n#         building_id = get_building_id(trajectory_path)\n#         print(f\"TST{counter}/{no_test_files} Building: {building_id}, Trajectory: {trajectory_id}\")\n\n#         trajectory = extract_trajectory(os.path.join(dirname, filename))\n#         if building_id not in ssids: \n#             ssids[building_id] = collections.Counter()\n#         if building_id not in bssids:\n#             bssids[building_id] = collections.Counter()\n\n#         ssids[building_id].update(list(trajectory[\"ssid\"]))\n#         bssids[building_id].update(list(trajectory[\"bssid\"]))   \n        \n#         trajectory_dir = f\"/kaggle/working/test/{building_id}/{trajectory_id}/\"\n#         os.makedirs(trajectory_dir, exist_ok=True)\n#         trajectory[\"wifi\"].to_csv(f\"{trajectory_dir}wifi.csv\", header=True, index=False)\n        \n#         if is_interactive() and counter > 10:\n#             break\n#     if is_interactive() and counter > 10:\n#         break\n\n\n        \n# with open(\"./ssid.json\", \"w\") as f:\n# #     print(ssids)\n#     json.dump({building_id: ssids_counter.most_common() for building_id, ssids_counter in ssids.items()}, f)\n# with open(\"./bssid.json\", \"w\") as f:\n# #     print(bssids)\n#     json.dump({building_id: bssids_counter.most_common() for building_id, bssids_counter in bssids.items()}, f)\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}