{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport os\nimport gc\nfrom keras import Model, layers\nimport keras","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_waypoint_info(f):\n    \"\"\"Take a text wrapper as input. \n        Returns `TYPE_WAYPOINT` locations along \n        with the corresponding time stamp as an array.\"\"\"\n    way_points = []\n    way_point_timestamps = []\n    for line in f:\n        if 'TYPE_WAYPOINT' in line:\n            columns = line.split('\\t')\n            way_points.append([columns[2],columns[3].replace('\\n', '')])\n            way_point_timestamps.append(columns[0])\n    return np.array(way_points, dtype=np.float32), np.array(way_point_timestamps, dtype=np.int64)\n\ndef get_wifi_info(f):\n    wifi_timestamps = []\n    wifi_ssid = []\n    wifi_bssid = []\n    wifi_rssi = []\n    wifi_frequency = []\n    for line in f:\n        if 'TYPE_WIFI' in line:\n            columns = line.split('\\t')\n            wifi_timestamps.append(columns[0])\n            wifi_ssid.append(columns[2])\n            wifi_bssid.append(columns[3])\n            wifi_rssi.append(columns[4])\n            wifi_frequency.append(columns[5])\n    wifi_timestamps = np.array(wifi_timestamps, dtype=np.int64)\n    wifi_ssid = np.array(wifi_ssid, dtype = str)\n    wifi_bssid = np.array(wifi_bssid,dtype=str)\n    wifi_rssi = np.array(wifi_rssi, dtype=np.int32)\n    wifi_frequency = np.array(wifi_frequency, dtype=np.int32)\n    \n    return wifi_timestamps, wifi_ssid, wifi_bssid, wifi_rssi, wifi_frequency\n\ndef get_position(time, waypt, waypt_time):\n    '''From way_points and corresponding\n    timestamps it calculates the intermediate positions\n    for a specific time '''\n    if waypt_time[0] > time:\n        vel = (waypt[1]-waypt[0])/(waypt_time[1]-waypt_time[0])\n        path_crossed = vel*(waypt_time[0]-time)\n        position = waypt[0]+path_crossed\n        return position\n    \n    for i in range(len(waypt[:-1])):\n        if waypt_time[i+1] > time:\n            vel = (waypt[i+1]-waypt[i])/(waypt_time[i+1]-waypt_time[i])\n            path_crossed = vel*(waypt_time[i+1]-time)\n            position = waypt[i]+path_crossed\n            return position\n    \n    else:\n        vel = (waypt[-1]-waypt[-2])/(waypt_time[-1]-waypt_time[-2])\n        path_crossed = vel*(time-waypt_time[-1])\n        position = waypt[-1]+path_crossed\n        return position\n    \n    \nclass Wifi_element:\n    \"\"\"Stores all wifi data for a spacific instance\"\"\"\n    def __init__(self, ssid, bssid, rssi, frequency, timestamp, floor, position):\n        self.ssid = ssid\n        self.bssid = bssid\n        self.rssi = rssi\n        self.frequency = frequency\n        self.timestamp = timestamp\n        self.floor = floor\n        self.postition = position\n        \ndef get_wifi_dataset(folder):\n    \"\"\"Collectes all the `Wifi_element` the folder of a Mall\"\"\"\n    wifi_instances = []\n    for floor in os.listdir(folder):\n        for file in os.listdir(f'{folder}/{floor}'):\n            with open(f'{folder}/{floor}/{file}') as f:\n                trail_text = f.readlines()\n                waypoints , waypoint_timestamps = get_waypoint_info(trail_text)\n                wifi_timestamps, wifi_ssid, wifi_bssid, wifi_rssi, wifi_frequency = get_wifi_info(trail_text)\n                for i in range(len(wifi_timestamps)):\n                    position = get_position(wifi_timestamps[i],\n                                            waypoints,\n                                            waypoint_timestamps)\n                    wifi_instances.append(Wifi_element(wifi_ssid[i],\n                                                       wifi_bssid[i],\n                                                       wifi_rssi[i],\n                                                       wifi_frequency[i],\n                                                       wifi_timestamps[i],\n                                                       floor, position))\n    return wifi_instances","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nwifi_instances = get_wifi_dataset(folder)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nssid_ = np.unique([instance.ssid for instance in wifi_instances])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.random.shuffle(wifi_instances)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def mean_position_error(y_true,y_predict):\n    mse = keras.losses.mse(y_true[:, 0:2], y_predict[:, 0:2])\n    floor_diff = []\n    for i in range(len(y_true)):\n        floor_diff.append(abs(np.argmax(y_true[i,2:]) - np.argmax(y_predict[i, 2:])))\n    print(floor_diff)\n    return mse + 15*floor_diff","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Modeling\ninputs = keras.Input(shape=(738,))\ndense_1 = layers.Dense(36, activation='relu')(inputs)\ndense_2 = layers.Dense(24, activation='relu')(dense_1)\ndense_3 = layers.Dense(5, activation='sigmoid')(dense_2)\ndense_4 = layers.Dense(2)(dense_2)\ndense_output = layers.Concatenate(axis=1)([dense_4, dense_3])\n\nmodel = Model(inputs = inputs, outputs=dense_output, name='Test_model')\n\nmodel.compile(\n    loss=mean_position_error,\n    optimizer=keras.optimizers.RMSprop(),\n    metrics=[\"accuracy\"],\n)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"floors = ['B1', 'F1', 'F2', 'F3', 'F4']\nX = []\ny =[]\nfor instance in wifi_instances[:10000]:\n    x_row = []\n    y_row = []\n    for ssid in ssid_:\n        if ssid == instance.ssid:\n            x_row.append(1)\n        else:\n            x_row.append(0)\n    x_row.append(instance.rssi)\n    x_row.append(instance.frequency)\n    X.append(x_row)\n    y_row.append(instance.postition[0])\n    y_row.append(instance.postition[1])\n    for floor in floors:\n        if floor == instance.floor:\n            y_row.append(1)\n        else:\n            y_row.append(0)\n    y.append(y_row)\n\nX = np.array(X)\ny = np.array(y)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(X,y, batch_size=1000, epochs=10)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mean_position_error(np.array([[1,2,3,4,5,6],[1,2,3,4,5,6]]), np.array([[3,6,8,8,9],[3,6,8,8,9]]))","metadata":{"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_true = np.array([[1,2,3,4,5,6],[1,2,3,4,5,6]])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_predict =  np.array([[3,6,8,8,9],[3,6,8,8,9]])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_true[:, 0:2]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" y_predict[:, 0:2]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m = keras.metrics.RootMeanSquaredError()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m.update_state([[1,5],[1,5]], [[2,5],[2,3]])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"m.result().numpy()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}