diff --git a/_modules/network_gym_client/adapter.html b/_modules/network_gym_client/adapter.html index 3b5ccea..e6b29aa 100644 --- a/_modules/network_gym_client/adapter.html +++ b/_modules/network_gym_client/adapter.html @@ -319,12 +319,16 @@

Source code for network_gym_client.adapter

         Returns:
             dict : converted data with dictionary format
         """
-        df_cp = df.copy()
-        df_cp['user'] = df_cp['user'].map(lambda u: f'UE{u}_'+description)
-        # Set the index to the 'user' column
-        df_cp = df_cp.set_index('user')
-        # Convert the DataFrame to a dictionary
-        data = df_cp['value'].to_dict()
+        if df is None:
+            return {}
+        get_key = lambda u: f'UE_{u}_'+description
+        dict_key = list(map(get_key, df['user']))
+        dict_value = df['value']
+
+        #print(dict_key)
+        #print(dict_value)
+
+        data = dict(zip(dict_key, dict_value))
         return data
 
     def fill_empty_feature(self, feature, value):
@@ -340,18 +344,34 @@ 

Source code for network_gym_client.adapter

         
         #Fill the missing data with the input value.
         
-        if len(feature) > self.config_json['env_config']['num_users']:
+        if feature is None:
+            print("[WARNING] all users of a feature returns empty measurement.")
+            emptyFeatureArray = np.empty([self.config_json['env_config']['num_users'],], dtype=int)
+            emptyFeatureArray.fill(value)
+            return emptyFeatureArray
+
+        if len(feature['user']) > self.config_json['env_config']['num_users']:
             print ("[WARNING] This feature has more user than input!!")
-            print(feature)
-        elif len(feature) == self.config_json['env_config']['num_users']:
+            print (feature)
+            emptyFeatureArray = np.empty([self.config_json['env_config']['num_users'],], dtype=int)
+            emptyFeatureArray.fill(value)
+            return emptyFeatureArray
+        elif len(feature['user']) == self.config_json['env_config']['num_users']:
             # measurement size match the user number
-            return feature[:]["value"]
-        if len(feature)> 0:
+            return feature["value"]
+        elif len(feature['user'])> 0:
             # some of the user's data are missing, fill with input value.
             print("[WARNING] some users of a feature returns empty measurement.")
-            feature = feature.set_index("user")
-            feature = feature.reindex(list(range(self.config_json['env_config']['num_users'])),fill_value=value)
-            data = feature[:]["value"]
+            #feature = feature.set_index("user")
+            #feature = feature.reindex(list(range(self.config_json['env_config']['num_users'])),fill_value=value)
+            #data = feature[:]["value"]
+
+            data = np.empty([self.config_json['env_config']['num_users'],], dtype=int)
+            data.fill(value)
+
+            for index, user_id in enumerate(feature['user']):
+                data[user_id] = feature['value'][index]
+            #print(data)
             return data
         else:
             # all user's data are missing, fill the entire feature will input value.
@@ -359,7 +379,7 @@ 

Source code for network_gym_client.adapter

             emptyFeatureArray = np.empty([self.config_json['env_config']['num_users'],], dtype=int)
             emptyFeatureArray.fill(value)
             return emptyFeatureArray
-    def get_nested_json_policy (self, action_name, tags, action, user_name='user'):
+    def get_nested_json_policy (self, action_name, tags, action, index_name='user'):
         """Convert the gymnasium action space to nested json format
 
         Args:
@@ -371,24 +391,12 @@ 

Source code for network_gym_client.adapter

             json: a nested json policy for the network
         """
 
-        data = []
-        for user_id in range(len(action)):
-            data.append([user_id, action[user_id]])
-        df = pd.DataFrame(data, columns=[user_name, 'value'])
-        for key, value in reversed(tags.items()):
-            df.insert(0, key, value)
-        df.insert(0,'name', action_name)# the name of your action.
-
-        # the following code tranform the json to a nested structure for lower overhead.
-        group_by_list = list(tags.keys())
-        group_by_list.insert(0, 'name')
-        json_data = (df.groupby(group_by_list)
-                .apply(lambda x: x[[user_name, 'value', ]].to_dict(orient='list'))
-                .reset_index()
-                .rename(columns={0: ''})
-                .to_json(orient='records'))
-
-        policy = json.loads(json_data)
+        policy = tags.copy()
+        policy['name'] = action_name
+        policy['']={}
+        policy[''][index_name] = list(range(len(action)))
+        policy['']['value'] = action.tolist()
+        #print(policy)
         return policy
diff --git a/_modules/network_gym_client/env.html b/_modules/network_gym_client/env.html index 217c502..d635978 100644 --- a/_modules/network_gym_client/env.html +++ b/_modules/network_gym_client/env.html @@ -333,12 +333,18 @@

Source code for network_gym_client.env

 
 
         self.steps_per_episode = int(config_json['env_config']['steps_per_episode'])
+        if self.steps_per_episode < 2:
+            sys.exit('In crease the "steps_per_episode", the min value is 2!')
         self.episodes_per_session = int(config_json['env_config']['episodes_per_session'])
 
-        step_length = config_json['env_config']['measurement_interval_ms'] + config_json['env_config']['measurement_guard_interval_ms']
+        step_length = config_json['env_config']['measurement_interval_ms']
+        if 'measurement_guard_interval_ms' in config_json['env_config']:
+            step_length = step_length + config_json['env_config']['measurement_guard_interval_ms']
+
+
         # compute the simulation time based on setting
-        config_json['env_config']['simulation_time_s'] = int((config_json['env_config']['app_and_measurement_start_time_ms'] + step_length * self.steps_per_episode * self.episodes_per_session)/1000)
-        print("Environment duration: " + str(config_json['env_config']['simulation_time_s']) + "s")
+        config_json['env_config']['env_end_time_ms'] = int(config_json['env_config']['measurement_start_time_ms'] + step_length * (self.steps_per_episode) * self.episodes_per_session)
+        print("Environment duration: " + str(config_json['env_config']['env_end_time_ms']) + " ms")
         #Define config params
         module_path = 'network_gym_client.envs.'+config_json['env_config']['env']+'.adapter'
         module = importlib.import_module(module_path, package=None)
@@ -352,7 +358,6 @@ 

Source code for network_gym_client.env

         self.observation_space = self.adapter.get_observation_space()
 
         self.northbound_interface_client = NorthBoundClient(id, config_json) #initial northbound_interface_client
-        #self.max_counter = int(config_json['env_config']['simulation_time_s'] * 1000/config_json['env_config']['GMA']['measurement_interval_ms'])# Already checked the interval for Wi-Fi and LTE in the main file
 
         #self.link_type = config_json['rl_config']['link_type'] 
         self.current_step = 0
diff --git a/_modules/network_gym_client/envs/network_slicing/adapter.html b/_modules/network_gym_client/envs/network_slicing/adapter.html
index ca2881f..49f73dd 100644
--- a/_modules/network_gym_client/envs/network_slicing/adapter.html
+++ b/_modules/network_gym_client/envs/network_slicing/adapter.html
@@ -251,6 +251,7 @@ 

Source code for network_gym_client.envs.network_slicing.adapter

import sys from gymnasium import spaces import numpy as np +from pathlib import Path
[docs]class Adapter(network_gym_client.adapter.Adapter): """network_slicing environment adapter. @@ -265,7 +266,7 @@

Source code for network_gym_client.envs.network_slicing.adapter

config_json (json): the configuration file """ super().__init__(config_json) - self.env = "network_slicing" + self.env = Path(__file__).resolve().parent.name self.num_slices = len(self.config_json['env_config']['slice_list']) self.num_features = 3 self.end_ts = 0 @@ -279,7 +280,7 @@

Source code for network_gym_client.envs.network_slicing.adapter

self.rbg_num = self.config_json['env_config']['LTE']['resource_block_num']/rbg_size if config_json['env_config']['env'] != self.env: - sys.exit("[ERROR] wrong environment helper. config file environment: " + str(config_json['env_config']['env']) + " helper environment: " + str(self.env)) + sys.exit("[ERROR] wrong environment Adapter. Configured environment: " + str(config_json['env_config']['env']) + " != Launched environment: " + str(self.env)) def get_action_space(self): """Get action space for network_slicing env. @@ -315,26 +316,43 @@

Source code for network_gym_client.envs.network_slicing.adapter

Returns: spaces: observation spaces """ - print (df) + #print (df) if not df.empty: self.end_ts = int(df['end_ts'][0]) #data_recv_flat = df.explode(column=['user', 'value']) #print(data_recv_flat) - df_rate = df[df['name'] == 'rate'].reset_index(drop=True) # get the rate - df_rate = df_rate[df_rate['cid'] == 'All'].reset_index(drop=True).explode(column=['user', 'value']) #keep the flow rate. + df_rate = None + df_phy_wifi_max_rate = None + df_phy_lte_max_rate = None + df_phy_lte_slice_id = None + df_phy_lte_rb_usage = None + df_x_loc = None + df_y_loc = None + for index, row in df.iterrows(): + if row['name'] == 'rate': + if row['cid'] == 'All': + df_rate = row + elif row['name'] == 'max_rate': + if row['cid'] == 'LTE': + df_phy_lte_max_rate = row + elif row['cid'] == 'Wi-Fi': + df_phy_wifi_max_rate = row + elif row['name'] == 'slice_id': + df_phy_lte_slice_id = row + elif row['name'] == 'rb_usage': + df_phy_lte_rb_usage = row + elif row['name'] == 'x_loc': + df_x_loc = row + elif row['name'] == 'y_loc': + df_y_loc = row #print(df_rate) - - df_max_rate = df[df['name'] == 'max_rate'].reset_index(drop=True) - df_phy_lte_max_rate = df_max_rate[df_max_rate['cid'] == 'LTE'].reset_index(drop=True).explode(column=['user', 'value']) #get the LTE max_rate - df_phy_wifi_max_rate = df_max_rate[df_max_rate['cid'] == 'Wi-Fi'].reset_index(drop=True).explode(column=['user', 'value']) # get the Wi-Fi max rate - #print(df_phy_lte_max_rate) #print(df_phy_wifi_max_rate) - - df_phy_lte_slice_id = df[df['name'] == 'slice_id'].reset_index(drop=True).explode(column=['user', 'value']) - - df_phy_lte_rb_usage = df[df['name'] == 'rb_usage'].reset_index(drop=True).explode(column=['user', 'value']) + #print(df_phy_lte_slice_id) + #Print(df_phy_lte_rb_usage) + #print(df_x_loc) + #Print(df_y_loc) # if not empty and send to wanDB database self.wandb_log_buffer_append(self.df_to_dict(df_phy_wifi_max_rate, "max-wifi-rate")) @@ -342,17 +360,15 @@

Source code for network_gym_client.envs.network_slicing.adapter

self.wandb_log_buffer_append(self.df_to_dict(df_phy_lte_max_rate, "max-lte-rate")) dict_rate = self.df_to_dict(df_rate, 'rate') - dict_rate["sum_rate"] = df_rate[:]["value"].sum() + dict_rate["sum_rate"] = sum(df_rate["value"]) self.wandb_log_buffer_append(dict_rate) self.wandb_log_buffer_append(self.df_to_dict(df_phy_lte_slice_id, "lte-slice-id")) self.wandb_log_buffer_append(self.df_to_dict(df_phy_lte_rb_usage, "lte-rb-usage")) - df_x_loc = df[df['name'] == 'x_loc'].reset_index(drop=True).explode(column=['user', 'value']) self.wandb_log_buffer_append(self.df_to_dict(df_x_loc, "x_loc")) - df_y_loc = df[df['name'] == 'y_loc'].reset_index(drop=True).explode(column=['user', 'value']) self.wandb_log_buffer_append(self.df_to_dict(df_y_loc, "y_loc")) # Fill the empy features with -1 @@ -400,7 +416,7 @@

Source code for network_gym_client.envs.network_slicing.adapter

tags["rb_type"] = "S"# shared RBG policy3 = self.get_nested_json_policy('rb_allocation', tags, np.ones(len(scaled_action))*self.rbg_num, 'slice') - policy = policy1 + policy2 + policy3 + policy = [policy1, policy2, policy3] print('Action --> ' + str(policy)) return policy @@ -415,11 +431,21 @@

Source code for network_gym_client.envs.network_slicing.adapter

spaces: reward spaces """ - df_tx_rate = df[df['name'] == 'tx_rate'].reset_index(drop=True).explode(column=['user', 'value']) # get the rate + df_tx_rate = None + df_phy_lte_slice_id = None + df_phy_lte_rb_usage = None - df_phy_lte_rb_usage = df[df['name'] == 'rb_usage'].reset_index(drop=True).explode(column=['user', 'value']) + for index, row in df.iterrows(): + if row['name'] == 'tx_rate': + df_tx_rate = row.to_frame().T.explode(column=['user', 'value']) + elif row['name'] == 'slice_id': + df_phy_lte_slice_id = row.to_frame().T.explode(column=['user', 'value']) + elif row['name'] == 'rb_usage': + df_phy_lte_rb_usage = row.to_frame().T.explode(column=['user', 'value']) - df_phy_lte_slice_id = df[df['name'] == 'slice_id'].reset_index(drop=True).explode(column=['user', 'value']) + #print(df_tx_rate) + #print(df_phy_lte_slice_id) + #Print(df_phy_lte_rb_usage) user_to_slice_id = np.zeros(len(df_phy_lte_slice_id)) df_phy_lte_slice_id = df_phy_lte_slice_id.reset_index() # make sure indexes pair with number of rows @@ -436,7 +462,7 @@

Source code for network_gym_client.envs.network_slicing.adapter

df_slice_tx_rate = df_slice_tx_rate.drop(columns=['value']) #print (df_tx_rate) - print (df_slice_tx_rate) + #print (df_slice_tx_rate) df_phy_lte_rb_usage['slice_id']=user_to_slice_id[df_phy_lte_rb_usage['user'].astype(int)] df_phy_lte_rb_usage['slice_value']= df_phy_lte_rb_usage.groupby(['slice_id'])['value'].transform('sum') @@ -446,7 +472,7 @@

Source code for network_gym_client.envs.network_slicing.adapter

df_slice_lte_rb_usage = df_slice_lte_rb_usage.drop(columns=['value']) #print (df_phy_lte_rb_usage) - print (df_slice_lte_rb_usage) + #print (df_slice_lte_rb_usage) df_slice_tx_rate = self.slice_df_to_dict(df_slice_tx_rate, 'tx_rate') diff --git a/_modules/network_gym_client/envs/nqos_split/adapter.html b/_modules/network_gym_client/envs/nqos_split/adapter.html index b6ccd65..b5f0d90 100644 --- a/_modules/network_gym_client/envs/nqos_split/adapter.html +++ b/_modules/network_gym_client/envs/nqos_split/adapter.html @@ -252,6 +252,10 @@

Source code for network_gym_client.envs.nqos_split.adapter

from gymnasium import spaces import numpy as np import math +import time +import pandas as pd +import json +from pathlib import Path
[docs]class Adapter(network_gym_client.adapter.Adapter): """nqos_split env adapter. @@ -268,14 +272,14 @@

Source code for network_gym_client.envs.nqos_split.adapter

super().__init__(config_json) - self.env = "nqos_split" + self.env = Path(__file__).resolve().parent.name self.action_max_value = 32 self.num_features = 3 self.num_users = int(self.config_json['env_config']['num_users']) self.end_ts = 0 if config_json['env_config']['env'] != self.env: - sys.exit("[ERROR] wrong environment helper. config file environment: " + str(config_json['env_config']['env']) + " helper environment: " + str(self.env)) + sys.exit("[ERROR] wrong environment Adapter. Configured environment: " + str(config_json['env_config']['env']) + " != Launched environment: " + str(self.env)) def get_action_space(self): """Get action space for the nqos_split env. @@ -308,26 +312,41 @@

Source code for network_gym_client.envs.nqos_split.adapter

Returns: spaces: observation spaces """ - print (df) + #print (df) if not df.empty: self.end_ts = int(df['end_ts'][0]) #data_recv_flat = df.explode(column=['user', 'value']) #print(data_recv_flat) - df_rate = df[df['name'] == 'rate'].reset_index(drop=True) # get the rate - df_rate = df_rate[df_rate['cid'] == 'All'].reset_index(drop=True).explode(column=['user', 'value']) #keep the flow rate. - #print(df_rate) - - df_max_rate = df[df['name'] == 'max_rate'].reset_index(drop=True) - df_phy_lte_max_rate = df_max_rate[df_max_rate['cid'] == 'LTE'].reset_index(drop=True).explode(column=['user', 'value']) #get the LTE max_rate - df_phy_wifi_max_rate = df_max_rate[df_max_rate['cid'] == 'Wi-Fi'].reset_index(drop=True).explode(column=['user', 'value']) # get the Wi-Fi max rate + df_rate = None + df_phy_wifi_max_rate = None + df_phy_lte_max_rate = None + df_wifi_split_ratio = None + df_x_loc = None + df_y_loc = None + for index, row in df.iterrows(): + if row['name'] == 'rate': + if row['cid'] == 'All': + df_rate = row + elif row['name'] == 'max_rate': + if row['cid'] == 'LTE': + df_phy_lte_max_rate = row + elif row['cid'] == 'Wi-Fi': + df_phy_wifi_max_rate = row + elif row['name'] == 'split_ratio': + if row['cid'] == 'Wi-Fi': + df_wifi_split_ratio = row + elif row['name'] == 'x_loc': + df_x_loc = row + elif row['name'] == 'y_loc': + df_y_loc = row + #print(df_rate) #print(df_phy_lte_max_rate) #print(df_phy_wifi_max_rate) - - df_split_ratio = df[df['name'] == 'split_ratio'].reset_index(drop=True) - df_wifi_split_ratio = df_split_ratio[df_split_ratio['cid'] == 'Wi-Fi'].reset_index(drop=True).explode(column=['user', 'value']) # get the Wi-Fi split ratio #print(df_wifi_split_ratio) + #print(df_x_loc) + #Print(df_y_loc) # if not empty and send to wanDB database self.wandb_log_buffer_append(self.df_to_dict(df_phy_wifi_max_rate, "max-wifi-rate")) @@ -335,15 +354,13 @@

Source code for network_gym_client.envs.nqos_split.adapter

self.wandb_log_buffer_append(self.df_to_dict(df_phy_lte_max_rate, "max-lte-rate")) dict_rate = self.df_to_dict(df_rate, 'rate') - dict_rate["sum_rate"] = df_rate[:]["value"].sum() + dict_rate["sum_rate"] = sum(df_rate["value"]) self.wandb_log_buffer_append(dict_rate) self.wandb_log_buffer_append(self.df_to_dict(df_wifi_split_ratio, "wifi-split-ratio")) - df_x_loc = df[df['name'] == 'x_loc'].reset_index(drop=True).explode(column=['user', 'value']) self.wandb_log_buffer_append(self.df_to_dict(df_x_loc, "x_loc")) - df_y_loc = df[df['name'] == 'y_loc'].reset_index(drop=True).explode(column=['user', 'value']) self.wandb_log_buffer_append(self.df_to_dict(df_y_loc, "y_loc")) # Fill the empy features with -1 @@ -389,7 +406,7 @@

Source code for network_gym_client.envs.nqos_split.adapter

tags["cid"] = 'LTE' policy2 = self.get_nested_json_policy('split_ratio', tags, (self.action_max_value-scaled_action)) - policy = policy1 + policy2 + policy = [policy1, policy2] print('Action --> ' + str(policy)) return policy @@ -402,17 +419,21 @@

Source code for network_gym_client.envs.nqos_split.adapter

Returns: spaces: reward spaces """ - - df_owd = df[df['name'] == 'owd'].reset_index(drop=True) # get the owd - df_owd = df_owd[df_owd['cid'] == 'All'].reset_index(drop=True).explode(column=['user', 'value']) #keep the flow owd. - - df_rate = df[df['name'] == 'rate'].reset_index(drop=True) # get the rate - df_rate = df_rate[df_rate['cid'] == 'All'].reset_index(drop=True).explode(column=['user', 'value']) #keep the flow rate. + df_owd = None + df_rate = None + + for index, row in df.iterrows(): + if row['name'] == 'rate': + if row['cid'] == 'All': + df_rate = row + elif row['name'] == 'owd': + if row['cid'] == 'All': + df_owd = row + + ave_rate = np.mean(df_rate["value"]) + avg_delay = np.mean(df_owd["value"]) + max_delay = np.max(df_owd["value"]) - ave_rate = df_rate["value"].mean() - avg_delay = df_owd["value"].mean() - max_delay = df_owd["value"].max() - reward = 0 if self.config_json["rl_config"]["reward_type"] == "utility": reward = self.netowrk_util(ave_rate, avg_delay) diff --git a/_modules/network_gym_client/envs/qos_steer/adapter.html b/_modules/network_gym_client/envs/qos_steer/adapter.html index 7becc61..4b07cf5 100644 --- a/_modules/network_gym_client/envs/qos_steer/adapter.html +++ b/_modules/network_gym_client/envs/qos_steer/adapter.html @@ -251,6 +251,7 @@

Source code for network_gym_client.envs.qos_steer.adapter

import sys from gymnasium import spaces import numpy as np +from pathlib import Path
[docs]class Adapter(network_gym_client.adapter.Adapter): """qos_steer environment adapter. @@ -266,12 +267,12 @@

Source code for network_gym_client.envs.qos_steer.adapter

""" super().__init__(config_json) - self.env = "qos_steer" + self.env = Path(__file__).resolve().parent.name self.num_features = 3 self.num_users = int(self.config_json['env_config']['num_users']) self.end_ts = 0 if config_json['env_config']['env'] != self.env: - sys.exit("[ERROR] wrong environment helper. config file environment: " + str(config_json['env_config']['env']) + " helper environment: " + str(self.env)) + sys.exit("[ERROR] wrong environment Adapter. Configured environment: " + str(config_json['env_config']['env']) + " != Launched environment: " + str(self.env)) def get_action_space (self): """Get action space for qos_steer env. @@ -306,26 +307,41 @@

Source code for network_gym_client.envs.qos_steer.adapter

Returns: spaces: observation spaces """ - print (df) + #print (df) if not df.empty: self.end_ts = int(df['end_ts'][0]) #data_recv_flat = df.explode(column=['user', 'value']) #print(data_recv_flat) - df_rate = df[df['name'] == 'rate'].reset_index(drop=True) # get the rate - df_rate = df_rate[df_rate['cid'] == 'All'].reset_index(drop=True).explode(column=['user', 'value']) #keep the flow rate. - #print(df_rate) - - df_max_rate = df[df['name'] == 'max_rate'].reset_index(drop=True) - df_phy_lte_max_rate = df_max_rate[df_max_rate['cid'] == 'LTE'].reset_index(drop=True).explode(column=['user', 'value']) #get the LTE max_rate - df_phy_wifi_max_rate = df_max_rate[df_max_rate['cid'] == 'Wi-Fi'].reset_index(drop=True).explode(column=['user', 'value']) # get the Wi-Fi max rate + df_rate = None + df_phy_wifi_max_rate = None + df_phy_lte_max_rate = None + df_wifi_split_ratio = None + df_x_loc = None + df_y_loc = None + for index, row in df.iterrows(): + if row['name'] == 'rate': + if row['cid'] == 'All': + df_rate = row + elif row['name'] == 'max_rate': + if row['cid'] == 'LTE': + df_phy_lte_max_rate = row + elif row['cid'] == 'Wi-Fi': + df_phy_wifi_max_rate = row + elif row['name'] == 'split_ratio': + if row['cid'] == 'Wi-Fi': + df_wifi_split_ratio = row + elif row['name'] == 'x_loc': + df_x_loc = row + elif row['name'] == 'y_loc': + df_y_loc = row + #print(df_rate) #print(df_phy_lte_max_rate) #print(df_phy_wifi_max_rate) - - df_split_ratio = df[df['name'] == 'split_ratio'].reset_index(drop=True) - df_wifi_split_ratio = df_split_ratio[df_split_ratio['cid'] == 'Wi-Fi'].reset_index(drop=True).explode(column=['user', 'value']) # get the Wi-Fi split ratio #print(df_wifi_split_ratio) + #print(df_x_loc) + #Print(df_y_loc) # if not empty and send to wanDB database self.wandb_log_buffer_append(self.df_to_dict(df_phy_wifi_max_rate, "max-wifi-rate")) @@ -333,15 +349,13 @@

Source code for network_gym_client.envs.qos_steer.adapter

self.wandb_log_buffer_append(self.df_to_dict(df_phy_lte_max_rate, "max-lte-rate")) dict_rate = self.df_to_dict(df_rate, 'rate') - dict_rate["sum_rate"] = df_rate[:]["value"].sum() + dict_rate["sum_rate"] = sum(df_rate["value"]) self.wandb_log_buffer_append(dict_rate) self.wandb_log_buffer_append(self.df_to_dict(df_wifi_split_ratio, "wifi-split-ratio")) - df_x_loc = df[df['name'] == 'x_loc'].reset_index(drop=True).explode(column=['user', 'value']) self.wandb_log_buffer_append(self.df_to_dict(df_x_loc, "x_loc")) - df_y_loc = df[df['name'] == 'y_loc'].reset_index(drop=True).explode(column=['user', 'value']) self.wandb_log_buffer_append(self.df_to_dict(df_y_loc, "y_loc")) # Fill the empy features with -1 @@ -383,7 +397,7 @@

Source code for network_gym_client.envs.qos_steer.adapter

tags["cid"] = 'LTE' policy2 = self.get_nested_json_policy('split_ratio', tags, (1-action)) - policy = policy1 + policy2 + policy = [policy1, policy2] print('Action --> ' + str(policy)) return policy @@ -396,8 +410,12 @@

Source code for network_gym_client.envs.qos_steer.adapter

Returns: spaces: reward space """ - df_qos_rate = df[df['name'] == 'qos_rate'].reset_index(drop=True) - df_wifi_qos_rate = df_qos_rate[df_qos_rate['cid'] == 'Wi-Fi'].reset_index(drop=True).explode(column=['user', 'value']) # get the Wi-Fi qos_rate + + df_wifi_qos_rate = None + for index, row in df.iterrows(): + if row['name'] == 'qos_rate': + if row['cid'] == 'Wi-Fi': + df_wifi_qos_rate = row #print (df_wifi_qos_rate) reward = 0 @@ -421,7 +439,10 @@

Source code for network_gym_client.envs.qos_steer.adapter

double: reward """ #print(qos_rate) - reward = np.sum(qos_rate>0.1) #we assume the min qos rate is 0.1 mbps + reward = 0 + for r in qos_rate: + if r > 0.1: #we assume the min qos rate is 0.1 mbps + reward = reward + 1 return reward
diff --git a/_modules/network_gym_client/northbound_interface.html b/_modules/network_gym_client/northbound_interface.html index 1ed4d75..1794f77 100644 --- a/_modules/network_gym_client/northbound_interface.html +++ b/_modules/network_gym_client/northbound_interface.html @@ -360,7 +360,13 @@

Source code for network_gym_client.northbound_interface

Returns: pd.DataFrame: the processed network stats measurement """ - network_stats = pd.json_normalize(reply_json['metric_list']) + network_stats = pd.json_normalize(reply_json['network_stats']) + if "workload_stats" in reply_json: + # workload measurement available + print('Env Measurement --> ' + str(reply_json['workload_stats'])) + #if "sim_time_lapse_ms" and "time_lapse_ms" in reply_json['workload_stats']: + # if reply_json['workload_stats']['time_lapse_ms']>0: + # print('Env Measurement --> Percentage of time spend on simulation: ' + str(int(100*reply_json['workload_stats']['sim_time_lapse_ms']/reply_json['workload_stats']['time_lapse_ms'])) + '%') return network_stats
diff --git a/_modules/network_gym_env/configure.html b/_modules/network_gym_env/configure.html index 0657f18..1ad2e4c 100644 --- a/_modules/network_gym_env/configure.html +++ b/_modules/network_gym_env/configure.html @@ -251,6 +251,7 @@

Source code for network_gym_env.configure

 import json
 import traceback
 import pathlib
+import socket
 FILE_PATH = pathlib.Path(__file__).parent
 from network_gym_env.southbound_interface import *
 
@@ -302,7 +303,7 @@ 

Source code for network_gym_env.configure

         #common_config.json is shared by all environments
         f = open(FILE_PATH / 'common_config.json')
         self.config_json = json.load(f)
-        self.identity = u'%s-%d' % (self.config_json["session_name"], id)
+        self.identity = u'%s-%d-%s' % (self.config_json["session_name"], id, socket.gethostname())
         self.env_list = env_list
         self.NetworkGymSim = NetworkGymSim
 
diff --git a/_modules/network_gym_env/dummy_sim.html b/_modules/network_gym_env/dummy_sim.html
index 627963f..ff0fbd7 100644
--- a/_modules/network_gym_env/dummy_sim.html
+++ b/_modules/network_gym_env/dummy_sim.html
@@ -289,9 +289,9 @@ 

Source code for network_gym_env.dummy_sim

         """
         # use the config_json to config the simulator
         self.interval = msg_json['measurement_interval_ms'] + msg_json['measurement_guard_interval_ms'] # measurement interval
-        self.start_ts = msg_json['app_and_measurement_start_time_ms'] # start timestamp of a measurement
+        self.start_ts = msg_json['measurement_start_time_ms'] # start timestamp of a measurement
         self.end_ts = self.start_ts + self.interval # end timestamp of a measurement
-        self.sim_end_ts = self.start_ts + msg_json['simulation_time_s']*1000
+        self.sim_end_ts = self.start_ts + msg_json['env_end_time_ms']
         self.num_users = msg_json['num_users']
         self.start_simulation(env_identity, config_json, client_identity)
 
@@ -314,7 +314,7 @@ 

Source code for network_gym_env.dummy_sim

         # running simualtor
         while True:
             dummy_report = json.loads('{"type":"env-measurement"}')
-            dummy_report["metric_list"] = self.run_one_interval()
+            dummy_report["network_stats"] = self.run_one_interval()
 
             # the first part of the msg is the client_identity, the second part is the measurement report.
             msg = [client_identity.encode('utf-8'), json.dumps(dummy_report, indent=2).encode('utf-8')]
diff --git a/_sources/environments/mx_network_slicing/cellular_network_slicing.md.txt b/_sources/environments/mx_network_slicing/cellular_network_slicing.md.txt
index 31531cf..2d33246 100644
--- a/_sources/environments/mx_network_slicing/cellular_network_slicing.md.txt
+++ b/_sources/environments/mx_network_slicing/cellular_network_slicing.md.txt
@@ -18,7 +18,7 @@ Within each slice, the agent can designate resources as dedicated, prioritized,
 | ----- | ---- |
 | Observation Space |  `Box(0.0, Inf, (5, N,), float32)` |
 | Action Space | `Box(0.0, 1.0, (N,), float32)`  |
-| Arguments | [config.json](https://github.com/IntelLabs/networkgym/network_gym_client/envs/network_slicing/config.json)  |
+| Arguments | [config.json](https://github.com/IntelLabs/networkgym/blob/main/network_gym_client/envs/network_slicing/config.json)  |
 | Select Environment | `config_json = load_config_file('network_slicing')` 
`env = NetworkGymEnv(client_id, config_json)` | ## Description @@ -50,7 +50,7 @@ The observation space is represented by a multidimensional array (`ndarray`) wit ```{eval-rst} The Observation Space can be customized in the :meth:`network_gym_client.envs.network_slicing.Adapter.get_observation` function. ``` -See [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for more details. +Refer to [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for further elaboration, along with a list of network statistics measurements. ```` ```{tip} @@ -91,7 +91,7 @@ In this formulation, we can adjust the emphasis given to the delay violation rat ```{eval-rst} The Reward can be customized in the :meth:`network_gym_client.envs.network_slicing.Adapter.get_reward` function. ``` -See [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for more details. +Refer to [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for further elaboration, along with a list of network statistics measurements. ```` ## Arguments diff --git a/_sources/environments/mx_traffic_management/mx_qos_traffic_steering.md.txt b/_sources/environments/mx_traffic_management/mx_qos_traffic_steering.md.txt index d214835..14875ca 100644 --- a/_sources/environments/mx_traffic_management/mx_qos_traffic_steering.md.txt +++ b/_sources/environments/mx_traffic_management/mx_qos_traffic_steering.md.txt @@ -17,7 +17,7 @@ In this environment, the agent performs periodic actions to select a link to ste | ----- | ---- | | Observation Space | `Box(0, Inf, (3, N,), float32)` | | Action Space | `MultiDiscrete([2, 2, ..., 2]) # N dimension` | -| Arguments | [config.json](https://github.com/IntelLabs/networkgym/network_gym_client/envs/qos_steer/config.json) | +| Arguments | [config.json](https://github.com/IntelLabs/networkgym/blob/main/network_gym_client/envs/qos_steer/config.json) | | Select Environment | `config_json = load_config_file('qos_steer')`
`env = NetworkGymEnv(client_id, config_json)` | ## Description @@ -60,7 +60,7 @@ The observation is an `ndarray` with shape `(3,N,)` representing three features ```{eval-rst} The Observation Space can be customized in the :meth:`network_gym_client.envs.qos_steer.Adapter.get_observation` function. ``` -See [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for more details. +Refer to [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for further elaboration, along with a list of network statistics measurements. ```` ```{tip} @@ -90,7 +90,7 @@ We computes the number of Quality of Service (QoS) users over Wi-Fi as reward fu ```{eval-rst} The Reward can be customized in the :meth:`network_gym_client.envs.qos_steer.Adapter.get_reward` function. ``` -See [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for more details. +Refer to [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for further elaboration, along with a list of network statistics measurements. ```` ## Arguments diff --git a/_sources/environments/mx_traffic_management/mx_traffic_splitting.md.txt b/_sources/environments/mx_traffic_management/mx_traffic_splitting.md.txt index 4b06422..e9b07fa 100644 --- a/_sources/environments/mx_traffic_management/mx_traffic_splitting.md.txt +++ b/_sources/environments/mx_traffic_management/mx_traffic_splitting.md.txt @@ -17,12 +17,12 @@ In this environment, the agent performs periodic actions to update the traffic s | ----- | ---- | | Observation Space | `Box(0, Inf, (3, N,), float32)` | | Action Space | `Box(0.0, 1.0, (N,), float32)` | -| Arguments | [config.json](https://github.com/IntelLabs/networkgym/network_gym_client/envs/nqos_split/config.json) | +| Arguments | [config.json](https://github.com/IntelLabs/networkgym/blob/main/network_gym_client/envs/nqos_split/config.json) | | Select Environment | `config_json = load_config_file('nqos_split')`
`env = NetworkGymEnv(client_id, config_json)` | ## Description -The Multi-Access (MX) Traffic Splitting environment represents a traffic management problem where multiple users are randomly distributed on a 2D plane, with each user connecting to a Cellular base station and the closest Wi-Fi access point. The handover between Wi-Fi access point is disabled. +The Multi-Access (MX) Traffic Splitting environment represents a traffic management problem where multiple users are randomly distributed on a 2D plane, with each user connecting to a Cellular base station and the closest Wi-Fi access point. The received signal-based handover between Wi-Fi access points can be enabled or disabled. The goal of traffic management is to strategically split traffic over both links, aiming to achieve high throughput and low latency. ## Prerequisite @@ -45,7 +45,7 @@ The observation is an `ndarray` with shape `(3,N,)` representing three features ```{eval-rst} The Observation Space can be customized in the :meth:`network_gym_client.envs.nqos_split.Adapter.get_observation` function. ``` -See [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for more details. +Refer to [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for further elaboration, along with a list of network statistics measurements. ```` ```{tip} @@ -83,7 +83,7 @@ The goal of the utility function is to maximize the throughput and minimizing de ```{eval-rst} The Reward can be customized in the :meth:`network_gym_client.envs.nqos_split.Adapter.get_reward` function. ``` -See [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for more details. +Refer to [Customizing Observation and Reward](../../tutorials/customizing_observation_and_reward.md) for further elaboration, along with a list of network statistics measurements. ```` ## Arguments diff --git a/_sources/tutorials/customizing_observation_and_reward.md.txt b/_sources/tutorials/customizing_observation_and_reward.md.txt index 7629804..07f4524 100644 --- a/_sources/tutorials/customizing_observation_and_reward.md.txt +++ b/_sources/tutorials/customizing_observation_and_reward.md.txt @@ -7,35 +7,37 @@ title: Customizing Observation and Reward Personalizing the observation and reward functions to match your experimental goals is achievable within the provided environments. Within the `Adapter` class for each environment, both the `get_observation` and `get_reward` functions take a network statistics measurement as input. An illustration of such a network statistics measurement is provided below: ```python - cid direction end_ts group name start_ts user value -0 LTE DL 6000 GMA ap_id 5900 [0, 1, 2, 3] [255.0, 255.0, 255.0, 255.0] -1 Wi-Fi DL 6000 GMA ap_id 5900 [0, 1, 2, 3] [0.0, 0.0, 1.0, 1.0] -2 All DL 6000 GMA delay_violation 5900 [0, 1, 2, 3] [100.0, 100.0, 100.0, 100.0] -3 All DL 6000 GMA max_owd 5900 [0, 1, 2, 3] [335.0, 703.0, 422.0, 299.0] -4 LTE DL 6000 GMA max_owd 5900 [0, 1, 2, 3] [335.0, 703.0, 422.0, 299.0] -5 Wi-Fi DL 6000 GMA max_owd 5900 [0, 1, 2, 3] [0.0, 1.0, 1.0, 0.0] -6 LTE DL 6000 PHY max_rate 5900 [0, 1, 2, 3] [35.0, 35.0, 22.0, 35.0] -7 Wi-Fi DL 6000 PHY max_rate 5900 [0, 1, 2, 3] [78.0, 78.0, 65.0, 78.0] -8 All DL 6000 GMA measurement_ok 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 1.0] -9 All DL 6000 GMA missed_action 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] -10 All DL 6000 GMA owd 5900 [0, 1, 2, 3] [327.0, 680.0, 403.0, 279.0] -11 LTE DL 6000 GMA owd 5900 [0, 1, 2, 3] [327.0, 680.0, 404.0, 280.0] -12 Wi-Fi DL 6000 GMA owd 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] -13 LTE DL 6000 GMA qos_marking 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 0.0] -14 Wi-Fi DL 6000 GMA qos_marking 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 0.0] -15 All DL 6000 GMA qos_rate 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] -16 LTE DL 6000 GMA qos_rate 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] -17 Wi-Fi DL 6000 GMA qos_rate 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] -18 All DL 6000 GMA rate 5900 [0, 1, 2, 3] [15.912, 9.056, 7.2, 14.984] -19 LTE DL 6000 GMA rate 5900 [0, 1, 2, 3] [8.472, 8.472, 5.336, 8.472] -20 Wi-Fi DL 6000 GMA rate 5900 [0, 1, 2, 3] [0.696, 4.64, 3.016, 4.992] -21 LTE DL 6000 GMA split_ratio 5900 [0, 1, 2, 3] [31.0, 16.0, 19.0, 22.0] -22 Wi-Fi DL 6000 GMA split_ratio 5900 [0, 1, 2, 3] [1.0, 16.0, 13.0, 10.0] -23 LTE DL 6000 GMA traffic_ratio 5900 [0, 1, 2, 3] [92.0, 65.0, 64.0, 63.0] -24 Wi-Fi DL 6000 GMA traffic_ratio 5900 [0, 1, 2, 3] [8.0, 35.0, 36.0, 37.0] -25 All DL 6000 GMA tx_rate 5900 [0, 1, 2, 3] [17.075, 9.408, 7.434, 15.797] -26 All DL 6000 GMA x_loc 5900 [0, 1, 2, 3] [12.040140997999378, 6.710302486045565, 52.547... -27 All DL 6000 GMA y_loc 5900 [0, 1, 2, 3] [6.167369006263322, 2.450729590703729, 9.45877... + cid direction end_ts group name start_ts user value +0 Wi-Fi DL 6000 GMA cell_id 5900 [0, 1, 2, 3] [0.0, 0.0, 1.0, 1.0] +1 LTE DL 6000 PHY cell_id 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 1.0] +2 All DL 6000 GMA delay_test_1_violation 5900 [0, 1, 2, 3] [100.0, 100.0, 72.99270072992701, 0.0] +3 All DL 6000 GMA delay_test_2_violation 5900 [0, 1, 2, 3] [100.0, 100.0, 0.0, 0.0] +4 All DL 6000 GMA delay_violation 5900 [0, 1, 2, 3] [100.0, 100.0, 100.0, 89.8989898989899] +5 All DL 6000 GMA max_owd 5900 [0, 1, 2, 3] [499.0, 538.0, 239.0, 195.0] +6 LTE DL 6000 GMA max_owd 5900 [0, 1, 2, 3] [499.0, 538.0, 239.0, 195.0] +7 Wi-Fi DL 6000 GMA max_owd 5900 [0, 1, 2, 3] [3.0, 2.0, 3.0, 4.0] +8 LTE DL 6000 PHY max_rate 5900 [0, 1, 2, 3] [35.0, 35.0, 22.0, 35.0] +9 Wi-Fi DL 6000 PHY max_rate 5900 [0, 1, 2, 3] [78.0, 78.0, 65.0, 78.0] +10 All DL 6000 GMA measurement_ok 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 1.0] +11 All DL 6000 GMA missed_action 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] +12 All DL 6000 GMA owd 5900 [0, 1, 2, 3] [484.0, 517.0, 214.0, 102.0] +13 LTE DL 6000 GMA owd 5900 [0, 1, 2, 3] [491.0, 517.0, 217.0, 145.0] +14 Wi-Fi DL 6000 GMA owd 5900 [0, 1, 2, 3] [0.0, 1.0, 0.0, 0.0] +15 LTE DL 6000 GMA priority 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 0.0] +16 Wi-Fi DL 6000 GMA priority 5900 [0, 1, 2, 3] [1.0, 1.0, 1.0, 1.0] +17 All DL 6000 GMA qos_rate 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] +18 LTE DL 6000 GMA qos_rate 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] +19 Wi-Fi DL 6000 GMA qos_rate 5900 [0, 1, 2, 3] [0.0, 0.0, 0.0, 0.0] +20 All DL 6000 GMA rate 5900 [0, 1, 2, 3] [13.352, 9.056, 15.912, 45.992] +21 LTE DL 6000 GMA rate 5900 [0, 1, 2, 3] [8.472, 8.472, 5.336, 8.24] +22 Wi-Fi DL 6000 GMA rate 5900 [0, 1, 2, 3] [6.848, 0.928, 10.336, 15.912] +23 LTE DL 6000 GMA split_ratio 5900 [0, 1, 2, 3] [17.0, 32.0, 9.0, 3.0] +24 Wi-Fi DL 6000 GMA split_ratio 5900 [0, 1, 2, 3] [15.0, 0.0, 23.0, 29.0] +25 LTE DL 6000 GMA traffic_ratio 5900 [0, 1, 2, 3] [55.0, 90.0, 34.0, 34.0] +26 Wi-Fi DL 6000 GMA traffic_ratio 5900 [0, 1, 2, 3] [45.0, 10.0, 66.0, 66.0] +27 All DL 6000 GMA tx_rate 5900 [0, 1, 2, 3] [14.636, 9.757, 14.52, 38.681] +28 All DL 6000 GMA x_loc 5900 [0, 1, 2, 3] [13.871206061072092, 6.702857783599929, 52.198... +29 All DL 6000 GMA y_loc 5900 [0, 1, 2, 3] [7.964088643728281, 1.6756194439050196, 9.0212... ``` ## Working with the Measurement @@ -61,48 +63,39 @@ Now, we elaborate on each row: | Row | Name | Description | | ----- | ---- | ---- | -| 0,1 | ap_id | LTE cell ID and Wi-Fi access point ID as measured by each user. *(NOTE: 255 is the default value, representing no measurement.)*| -| 2 | delay_violation | One-way delay violation percentage (%) as measured by each user; delay bound (delay_bound_ms) can be configured in the JSON file. *(NOTE: Only for QoS use case)* | -| 3,4,5 | max_owd | Maximum one-way delay measured by each user, involving LTE link, Wi-Fi link, and ALL. *(ALL: after reordering out-of-order packets from both links)*. | -| 6,7 | max_rate | LTE/Wi-Fi link capacity as measured by each user. | -| 8 | measurement_ok | 1: Measurement is valid; 0: An issue exists with the measurement.| -| 9 | missed_action | Count of missed actions by the environment. *(NOTE: Applicable in testbed environment where RL agent might take too long to compute an action. Simulator waits for action by default in simulations, therefore should always be 0.)* | -| 10,11,12 | owd | One-way delay measured by each user, involving LTE link, Wi-Fi link, and ALL. *(ALL: after reordering out-of-order packets from both links)*. | -| 13,14 | qos_marking | 1: QoS user; 0: Non-QoS user.| -| 15,16,17 | qos_rate | QoS delivery rate (output traffic throughput meeting QoS requirement) as measured by each user, comprising traffic over LTE link, Wi-Fi link, and ALL (combined). | -| 18,19,20 | rate | Delivery rate (output traffic throughput) measured by each user, including traffic over LTE link, Wi-Fi link, and ALL (combined).| -| 21,22 | split_ratio | Traffic split ratio (in range of [0, 32]) as measured by each user, covering LTE link, Wi-Fi link. LTE split ratio + Wi-Fi split ratio equals 32. | -| 23,34 | traffic_ratio | Traffic ratio (%) sending to each link measured by each user, involving LTE link, Wi-Fi link. traffic_ratio might not equal split_ratio, since the system takes sine time to apply the new action. | -| 25 | tx_rate | Load (input traffic throughput) measured by each user. | -| 26 | x_loc | x coordinate per user. | -| 27 | y_loc | y coordinate per user. | +| 0,1 | cell_id | LTE cell ID and Wi-Fi access point ID as measured by each user. *(NOTE: 255 is the default value, representing no measurement.)*| +| 2,3 | delay_test_*_violation | One-way delay violation percentage (%) *--for testing purpose--* as measured by each user; delay threshold (delay_test_*_thresh_ms) can be configured in the JSON file.| +| 4 | delay_violation | One-way delay violation percentage (%) as measured by each user; delay bound (delay_bound_ms) can be configured in the JSON file. *(NOTE: Only for QoS use case)* | +| 5,6,7 | max_owd | Maximum one-way delay measured by each user, involving LTE link, Wi-Fi link, and ALL. *(ALL: after reordering out-of-order packets from both links)*. | +| 8,9 | max_rate | LTE/Wi-Fi link capacity as measured by each user. | +| 10 | measurement_ok | 1: Measurement is valid; 0: An issue exists with the measurement.| +| 11 | missed_action | Count of missed actions by the environment. *(NOTE: Applicable in testbed environment where RL agent might take too long to compute an action. Simulator waits for action by default in simulations, therefore should always be 0.)* | +| 12,13,14 | owd | One-way delay measured by each user, involving LTE link, Wi-Fi link, and ALL. *(ALL: after reordering out-of-order packets from both links)*. | +| 15,16 | priority | 1: high priority; 0: low priority. When Dynamic Flow Prioritization is enabled, for each cell, mark 70%~90% of traffic or users to high priority. | +| 17,18,19 | qos_rate | QoS delivery rate (output traffic throughput meeting QoS requirement) as measured by each user, comprising traffic over LTE link, Wi-Fi link, and ALL (combined). | +| 20,21,22 | rate | Delivery rate (output traffic throughput) measured by each user, including traffic over LTE link, Wi-Fi link, and ALL (combined).| +| 23,24 | split_ratio | Traffic split ratio (in range of [0, 32]) as measured by each user, covering LTE link, Wi-Fi link. LTE split ratio + Wi-Fi split ratio equals 32. | +| 25,26 | traffic_ratio | Traffic ratio (%) sending to each link measured by each user, involving LTE link, Wi-Fi link. traffic_ratio might not equal split_ratio, since the system takes sine time to apply the new action. | +| 27 | tx_rate | Load (input traffic throughput) measured by each user. | +| 28 | x_loc | x coordinate per user. | +| 29 | y_loc | y coordinate per user. | ### Retrieving a Measurement -To retrieve a specific network statistic, such as `rate`, you can utilize the following code: +To retrieve a specific network statistic, such as `rate`, over a specifi link, such as `All`, you can utilize the following code: ```python -df_rate = df[df['name'] == 'rate'].reset_index(drop=True) # get the rate + for index, row in df.iterrows(): + if row['name'] == 'rate': + if row['cid'] == 'All': + df_rate = row ``` -For isolating the rate measurement to a specific link, such as `All`, you can execute the subsequent code: -```python -df_rate = df_rate[df_rate['cid'] == 'All'].reset_index(drop=True) # get the rate for the all link combined -``` - -Lastly, employ the `explode` function to transform the nested data frame into its original structure: +Optionally, employ the `explode` function to transform the row object into the dataframe structure: ```python df_rate = df_rate.explode(column=['user', 'value']) #keep the flow rate. ``` -This is the final result of the `rate` for each user, considering the combination of `All` links: -```python - cid direction end_ts group name start_ts user value -0 All DL 6000 GMA rate 5900 0 13.24 -0 All DL 6000 GMA rate 5900 1 18.464 -0 All DL 6000 GMA rate 5900 2 6.968 -0 All DL 6000 GMA rate 5900 3 19.28 -``` ### Filling the Missing Data ```{eval-rst} diff --git a/api/network_gym_client/adapter.html b/api/network_gym_client/adapter.html index 7184b0f..3e004b4 100644 --- a/api/network_gym_client/adapter.html +++ b/api/network_gym_client/adapter.html @@ -319,7 +319,7 @@

Methods
-network_gym_client.Adapter.get_nested_json_policy(self, action_name, tags, action, user_name='user')#
+network_gym_client.Adapter.get_nested_json_policy(self, action_name, tags, action, index_name='user')#

Convert the gymnasium action space to nested json format

Parameters:
diff --git a/environments/mx_network_slicing/cellular_network_slicing.html b/environments/mx_network_slicing/cellular_network_slicing.html index 66d61e0..e675250 100644 --- a/environments/mx_network_slicing/cellular_network_slicing.html +++ b/environments/mx_network_slicing/cellular_network_slicing.html @@ -265,7 +265,7 @@

Box(0.0, 1.0, (N,), float32)

Arguments

-

config.json

+

config.json

Select Environment

config_json = load_config_file('network_slicing')
env = NetworkGymEnv(client_id, config_json)

@@ -332,7 +332,7 @@

Observation Space

Note

The Observation Space can be customized in the network_gym_client.envs.network_slicing.Adapter.get_observation() function.

-

See Customizing Observation and Reward for more details.

+

Refer to Customizing Observation and Reward for further elaboration, along with a list of network statistics measurements.

Tip

@@ -389,7 +389,7 @@

Reward

Note

The Reward can be customized in the network_gym_client.envs.network_slicing.Adapter.get_reward() function.

-

See Customizing Observation and Reward for more details.

+

Refer to Customizing Observation and Reward for further elaboration, along with a list of network statistics measurements.

diff --git a/environments/mx_traffic_management/mx_qos_traffic_steering.html b/environments/mx_traffic_management/mx_qos_traffic_steering.html index 7fb5792..4325748 100644 --- a/environments/mx_traffic_management/mx_qos_traffic_steering.html +++ b/environments/mx_traffic_management/mx_qos_traffic_steering.html @@ -265,7 +265,7 @@

MultiDiscrete([2, 2, ..., 2]) # N dimension

Arguments

-

config.json

+

config.json

Select Environment

config_json = load_config_file('qos_steer')
env = NetworkGymEnv(client_id, config_json)

@@ -327,7 +327,7 @@

Observation Space

Note

The Observation Space can be customized in the network_gym_client.envs.qos_steer.Adapter.get_observation() function.

-

See Customizing Observation and Reward for more details.

+

Refer to Customizing Observation and Reward for further elaboration, along with a list of network statistics measurements.

Tip

@@ -352,7 +352,7 @@

Reward

Note

The Reward can be customized in the network_gym_client.envs.qos_steer.Adapter.get_reward() function.

-

See Customizing Observation and Reward for more details.

+

Refer to Customizing Observation and Reward for further elaboration, along with a list of network statistics measurements.

diff --git a/environments/mx_traffic_management/mx_traffic_splitting.html b/environments/mx_traffic_management/mx_traffic_splitting.html index 5a51491..0681cd5 100644 --- a/environments/mx_traffic_management/mx_traffic_splitting.html +++ b/environments/mx_traffic_management/mx_traffic_splitting.html @@ -265,7 +265,7 @@

Box(0.0, 1.0, (N,), float32)

Arguments

-

config.json

+

config.json

Select Environment

config_json = load_config_file('nqos_split')
env = NetworkGymEnv(client_id, config_json)

@@ -275,7 +275,7 @@

Description#

-

The Multi-Access (MX) Traffic Splitting environment represents a traffic management problem where multiple users are randomly distributed on a 2D plane, with each user connecting to a Cellular base station and the closest Wi-Fi access point. The handover between Wi-Fi access point is disabled. +

The Multi-Access (MX) Traffic Splitting environment represents a traffic management problem where multiple users are randomly distributed on a 2D plane, with each user connecting to a Cellular base station and the closest Wi-Fi access point. The received signal-based handover between Wi-Fi access points can be enabled or disabled. The goal of traffic management is to strategically split traffic over both links, aiming to achieve high throughput and low latency.

@@ -316,7 +316,7 @@

Observation Space

Note

The Observation Space can be customized in the network_gym_client.envs.nqos_split.Adapter.get_observation() function.

-

See Customizing Observation and Reward for more details.

+

Refer to Customizing Observation and Reward for further elaboration, along with a list of network statistics measurements.

Tip

@@ -379,7 +379,7 @@

Reward

Note

The Reward can be customized in the network_gym_client.envs.nqos_split.Adapter.get_reward() function.

-

See Customizing Observation and Reward for more details.

+

Refer to Customizing Observation and Reward for further elaboration, along with a list of network statistics measurements.

diff --git a/searchindex.js b/searchindex.js index 0ec2082..30ffc4c 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["README", "api/network_gym_client", "api/network_gym_client/adapter", "api/network_gym_client/adapter/network_slicing", "api/network_gym_client/adapter/nqos_split", "api/network_gym_client/adapter/qos_steer", "api/network_gym_client/env", "api/network_gym_client/northbound_interface", "api/network_gym_env", "api/network_gym_env/configure", "api/network_gym_env/simulator", "api/network_gym_env/southbound_interface", "api/network_gym_server", "contact", "content/motivation", "content/overview", "content/quickstart", "environments/mx_network_slicing", "environments/mx_network_slicing/cellular_network_slicing", "environments/mx_traffic_management", "environments/mx_traffic_management/mx_qos_traffic_steering", "environments/mx_traffic_management/mx_traffic_splitting", "index", "tutorials/customizing_observation_and_reward", "tutorials/handling_time_limits", "tutorials/implementing_custom_environment", "tutorials/training_agents"], "filenames": ["README.md", "api/network_gym_client.md", "api/network_gym_client/adapter.md", "api/network_gym_client/adapter/network_slicing.md", "api/network_gym_client/adapter/nqos_split.md", "api/network_gym_client/adapter/qos_steer.md", "api/network_gym_client/env.md", "api/network_gym_client/northbound_interface.md", "api/network_gym_env.md", "api/network_gym_env/configure.md", "api/network_gym_env/simulator.md", "api/network_gym_env/southbound_interface.md", "api/network_gym_server.md", "contact.md", "content/motivation.md", "content/overview.md", "content/quickstart.md", "environments/mx_network_slicing.md", "environments/mx_network_slicing/cellular_network_slicing.md", "environments/mx_traffic_management.md", "environments/mx_traffic_management/mx_qos_traffic_steering.md", "environments/mx_traffic_management/mx_traffic_splitting.md", "index.md", "tutorials/customizing_observation_and_reward.md", "tutorials/handling_time_limits.md", "tutorials/implementing_custom_environment.md", "tutorials/training_agents.md"], "titles": ["Build Documentation Website", "network_gym_client", "Adapter", "network_slicing Adapter", "nqos_split Adapter", "qos_steer Adapter", "Env", "NorthBound", "network_gym_env", "Configure", "Dummy Simulator", "SouthBound", "network_gym_server", "Contact", "Motivation", "Overview", "Quickstart", "Network Slicing", "Cellular Network Slicing", "Traffic Management", "Multi-Access QoS Traffic Steering", "Multi-Access Traffic Splitting", "NetworkGym: Democratizing Network AI", "Customizing Observation and Reward", "Handling Time Limits", "Implementing Custom Environment", "Training Agents"], "terms": {"option": [0, 1, 6, 16, 18, 20, 21, 22, 24], "creat": [0, 10, 16, 22, 25, 26], "new": [0, 10, 16, 23], "virtual": 0, "python": [0, 16, 22], "environ": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 20, 21, 22, 23, 24, 26], "python3": [0, 25], "m": [0, 18, 25], "venv": 0, "sphinx_venv": 0, "sourc": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11, 22, 26], "bin": 0, "activ": [0, 8, 15, 16, 26], "requir": [0, 14, 20, 22, 23], "librari": 0, "pip": 0, "r": [0, 18, 21], "txt": 0, "In": [0, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25], "doc": 0, "folder": 0, "run": [0, 6, 9, 10, 16, 18, 20, 21, 24], "follow": [0, 1, 6, 9, 18, 20, 21, 22, 23, 25], "command": [0, 25], "export": 0, "static": 0, "_build": 0, "html": 0, "make": [0, 16, 23], "clean": 0, "network_gym_cli": [0, 2, 3, 4, 5, 16, 18, 20, 21, 23, 24], "The": [0, 1, 6, 8, 9, 10, 12, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26], "contain": [0, 6, 16, 18, 23], "modul": [0, 8], "rm": 0, "sphinx": 0, "apidoc": 0, "o": [0, 16, 22], "d": 0, "2": [0, 6, 18, 20, 21, 22, 23, 25], "markdown": 0, "e": [0, 1, 6, 9, 10, 14, 18, 20, 21, 22, 24], "g": [0, 1, 6, 9, 10, 14, 20, 21, 22], "eval": 0, "autoclass": 0, "env": [0, 1, 3, 4, 5, 7, 8, 9, 10, 16, 18, 20, 21, 24, 25, 26], "networkgym": [1, 6, 7, 12, 18, 20, 21, 24, 25, 26], "client": [1, 6, 7, 8, 9, 10, 12, 18, 20, 21, 22, 25], "includ": [1, 12, 16, 22, 23, 26], "three": [1, 15, 18, 20, 21, 22, 24], "compon": [1, 8, 9, 12, 22], "custom": [1, 2, 6, 9, 15, 16, 18, 20, 21, 22, 24], "gymnasium": [1, 2, 6, 14, 15, 16, 26], "adapt": [1, 6, 15, 18, 20, 21, 23, 25], "northbound": [1, 6, 12, 15, 16, 22], "interfac": [1, 6, 7, 8, 11, 12, 16, 22, 25], "inheret": 1, "class": [1, 3, 4, 5, 6, 7, 9, 10, 16, 23, 25], "commun": [1, 6, 8, 15, 16], "agent": [1, 2, 3, 4, 5, 6, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25], "us": [1, 6, 9, 10, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26], "standard": [1, 14, 22, 25], "exchang": [1, 8, 9, 16, 22], "ob": [1, 2, 6, 16, 24], "reward": [1, 2, 6, 16, 22, 24], "action": [1, 2, 3, 4, 5, 6, 8, 9, 10, 17, 19, 22, 23, 24, 25, 26], "reset": [1, 6, 16, 24], "step": [1, 6, 18, 20, 21, 24, 25], "function": [1, 2, 3, 4, 5, 16, 18, 20, 21, 23], "import": [1, 16, 18, 20, 21, 24], "gym": [1, 6, 7, 22], "def": 1, "__init__": 1, "self": [1, 2, 3, 4, 5, 6, 7, 9, 10], "arg1": 1, "arg2": 1, "super": 1, "return": [1, 2, 3, 4, 5, 6, 7, 10, 11, 16], "observ": [1, 3, 4, 5, 6, 22, 26], "termin": [1, 6, 8, 9, 10, 16, 18, 20, 21, 25], "truncat": [1, 6, 16, 18, 20, 21], "info": [1, 2, 6, 16, 24, 25, 26], "seed": [1, 6], "none": [1, 6], "transform": [1, 2, 15, 23], "data": [1, 2, 5, 8, 15, 16, 18, 20, 22, 25, 26], "format": [1, 2, 15, 16, 22, 25], "from": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 18, 22, 23, 24, 26], "network_gym": [1, 2, 6], "other": [1, 9, 20, 24], "wai": [1, 6, 21, 23], "around": [1, 22], "network": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 20, 21, 23, 25, 26], "stat": [1, 2, 3, 4, 5, 7, 10, 22], "chang": [1, 24], "polici": [1, 2, 3, 4, 5, 7, 8, 16, 26], "connect": [1, 6, 7, 8, 9, 10, 11, 12, 15, 16, 19, 20, 21, 22, 23], "server": [1, 6, 7, 8, 9, 10, 11, 12, 16, 18, 20, 21, 22, 25], "configur": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 18, 20, 21, 22, 23, 24], "paramet": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 18, 20, 21, 24], "between": [1, 2, 6, 8, 9, 15, 21, 22, 25], "envrion": [1, 12], "config_json": [2, 3, 4, 5, 6, 7, 10, 11, 16, 18, 20, 21, 24], "thi": [2, 3, 4, 5, 6, 8, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "i": [2, 3, 4, 6, 7, 9, 10, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26], "an": [2, 6, 8, 9, 12, 14, 15, 16, 18, 20, 21, 22, 23, 24, 26], "It": [2, 6, 8, 15, 16, 18, 20, 21, 22, 24], "measur": [2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 18, 25], "json": [2, 3, 4, 5, 6, 7, 10, 11, 16, 18, 20, 21, 23, 24, 25], "space": [2, 3, 4, 5, 6], "also": [2, 6, 14, 16, 18, 20, 21, 22, 23, 24, 25], "can": [2, 6, 8, 9, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26], "appli": [2, 23], "initi": [2, 3, 4, 5, 6, 7, 8, 9, 18], "file": [2, 3, 4, 5, 6, 7, 10, 11, 16, 18, 20, 21, 23, 24, 25], "wandb_log_buffer_append": 2, "add": [2, 12, 16], "wandb": [2, 16], "log": [2, 6, 21], "buffer": 2, "send": [2, 6, 7, 8, 10, 16, 22, 23, 25, 26], "later": 2, "wandb_log": 2, "dict": [2, 6, 10, 16], "inform": [2, 6, 16, 20, 21, 22], "append": 2, "df_to_dict": 2, "df": [2, 3, 4, 5, 23], "descript": [2, 23], "datatyp": 2, "panda": [2, 5], "datafram": [2, 3, 4, 5, 7], "dictionari": [2, 6, 16], "object": [2, 6, 18], "string": 2, "descritpt": 2, "convert": 2, "fill_empty_featur": [2, 23], "featur": [2, 3, 4, 5, 18, 20, 21, 23], "valu": [2, 4, 6, 16, 18, 20, 21, 23, 25], "fill": 2, "miss": 2, "input": [2, 16, 23], "pd": [2, 3, 4, 5, 7], "int": [2, 3, 6, 7, 9, 10], "list": [2, 6, 9, 10, 16, 23], "result": [2, 6, 10, 16, 18, 20, 21, 23, 24], "after": [2, 6, 16, 18, 20, 21, 23, 24], "replac": 2, "get_nested_json_polici": 2, "action_nam": 2, "tag": [2, 10, 25], "user_nam": 2, "user": [2, 5, 6, 10, 16, 18, 19, 20, 21, 22, 23, 25, 26], "nest": [2, 23], "str": [2, 9, 10, 11], "name": [2, 9, 10, 16, 23, 25], "rl": [2, 3, 4, 5, 6, 16, 22, 23, 26], "base": [3, 4, 5, 8, 15, 16, 21, 22], "get_observ": [3, 4, 5, 18, 20, 21, 23], "prepar": [3, 4, 5], "should": [3, 4, 5, 6, 16, 18, 23, 25], "same": [3, 4, 5, 9, 18, 23, 25], "number": [3, 4, 5, 6, 10, 16, 18, 20, 21, 23, 24, 25], "defin": [3, 4, 5, 6, 16, 18, 20, 21, 22, 26], "get_observation_spac": [3, 4, 5, 23], "get_reward": [3, 4, 5, 18, 20, 21, 23], "get_polici": [3, 4, 5], "No": [3, 16, 26], "yet": 3, "get_action_spac": [3, 4, 5], "get": [3, 4, 5, 6, 23], "get_rbg_siz": 3, "bandwidth": [3, 20], "comput": [3, 16, 18, 20, 21, 22, 23], "resourc": [3, 17, 18, 20, 21], "block": [3, 18], "group": [3, 18, 23, 25], "size": [3, 23], "bandwith": 3, "rb": [3, 18], "code": [3, 9, 23, 26], "coppi": 3, "ns3": 3, "pf": 3, "type": [3, 6, 16, 22, 25], "0": [3, 4, 6, 16, 18, 20, 21, 23, 24, 25], "alloc": [3, 17, 18], "rbg": 3, "resouc": 3, "netowrk_util": [4, 21], "throughput": [4, 18, 20, 21, 23], "delai": [4, 6, 18, 20, 21, 23, 26], "alpha": 4, "5": [4, 18, 20, 21, 23, 25], "calcul": [4, 5, 20], "util": [4, 9, 15, 18, 20, 21, 22, 23, 25], "specifi": [4, 6, 16, 18, 20, 21, 24], "balanc": 4, "default": [4, 5, 6, 16, 18, 22, 23], "float": 4, "repres": [4, 16, 18, 20, 21, 23], "bit": 4, "per": [4, 5, 18, 20, 21, 23, 24], "second": [4, 16, 20, 21, 24], "metric": [4, 16, 23], "calculate_wifi_qos_user_num": [5, 20], "qos_rat": [5, 20, 23, 25], "qo": [5, 14, 16, 19, 23], "over": [5, 19, 20, 21, 23], "wi": [5, 19, 20, 21, 23, 25], "fi": [5, 19, 20, 21, 23, 25], "rate": [5, 18, 20, 21, 23, 25], "doubl": 5, "id": [6, 7, 9, 23], "initil": [6, 10], "intern": [6, 16], "state": [6, 16, 22, 26], "": [6, 8, 9, 16, 18, 20, 21, 23, 24, 25, 26], "prng": 6, "np_random": 6, "If": [6, 16, 24], "doe": [6, 22], "alreadi": [6, 20], "have": [6, 16, 18, 20, 21, 22, 23, 24, 26], "pass": 6, "chosen": 6, "some": [6, 16, 23], "entropi": 6, "timestamp": [6, 10, 23], "dev": 6, "urandom": 6, "howev": 6, "ha": [6, 16, 18, 20, 21, 24], "you": [6, 15, 16, 18, 20, 21, 23, 24, 25, 26], "integ": 6, "even": 6, "exist": [6, 23], "usual": 6, "want": 6, "right": [6, 18], "been": [6, 16, 26], "never": 6, "again": 6, "pleas": [6, 22, 25], "refer": [6, 16, 22, 24, 25, 26], "minim": [6, 21], "exampl": [6, 16], "abov": [6, 22], "see": [6, 18, 20, 21], "paradigm": 6, "addit": [6, 16, 22], "how": [6, 15, 16, 22, 24, 25], "depend": [6, 25], "specif": [6, 14, 15, 18, 22, 23, 24, 26], "obstyp": 6, "auxiliari": 6, "complement": 6, "analog": 6, "one": [6, 8, 10, 16, 18, 21, 23, 24], "timestep": [6, 16], "dynam": 6, "gamsim": 6, "check": 6, "last": [6, 24], "episod": [6, 16, 24, 25], "done": [6, 16], "acttyp": 6, "provid": [6, 9, 15, 16, 20, 21, 22, 23, 24, 25, 26], "updat": [6, 16, 19, 21, 23], "element": [6, 15, 16], "observation_spac": [6, 16], "next": [6, 16], "due": 6, "supportsfloat": 6, "take": [6, 16, 18, 20, 23], "bool": 6, "whether": 6, "reach": [6, 16, 20], "under": [6, 22], "mdp": 6, "task": [6, 25], "which": [6, 15, 16, 18, 20, 23], "posit": [6, 18, 20, 21], "neg": 6, "goal": [6, 20, 21, 23], "move": 6, "lava": 6, "sutton": 6, "barton": 6, "gridworld": 6, "true": [6, 16, 23], "need": [6, 14, 16, 18, 22], "call": [6, 16], "condit": 6, "outsid": 6, "scope": 6, "satisfi": 6, "typic": 6, "timelimit": [6, 16], "could": [6, 16], "indic": [6, 18, 20], "physic": [6, 22], "go": 6, "out": [6, 16, 22, 23], "bound": [6, 16, 23], "end": [6, 8, 16, 22, 23, 24], "prematur": 6, "befor": 6, "diagnost": 6, "help": [6, 16], "debug": 6, "learn": [6, 14, 22, 25, 26], "raw": 6, "flag": 6, "deprec": 6, "A": [6, 10, 16, 18, 20, 21, 22, 23, 24, 26], "boolean": 6, "case": [6, 14, 16, 18, 22, 23], "further": [6, 16], "undefin": 6, "wa": 6, "remov": 6, "openai": 6, "v26": 6, "favor": 6, "signal": [6, 8, 9, 16], "mai": [6, 16, 24], "emit": 6, "differ": [6, 16, 20, 22, 24], "reason": 6, "mayb": 6, "underli": [6, 9, 22], "solv": 6, "successfulli": [6, 25], "certain": [6, 18, 20, 21, 23, 24], "exceed": [6, 16], "simul": [6, 8, 9, 14, 15, 22, 23], "enter": 6, "invalid": 6, "action_spac": [6, 16, 24, 26], "correspond": [6, 15], "valid": [6, 16, 23], "all": [6, 9, 16, 17, 18, 20, 21, 23, 25], "For": [6, 16, 20, 22, 23, 25], "discret": [6, 16], "give": 6, "mean": 6, "ar": [6, 8, 9, 16, 18, 20, 21, 22, 25], "two": [6, 8, 12, 15, 22, 24], "1": [6, 16, 18, 20, 21, 23, 24, 25], "box": [6, 15, 16, 18, 20, 21], "3": [6, 8, 9, 14, 15, 16, 18, 20, 21, 22, 23, 24, 25], "4028234663852886e": 6, "38": 6, "4": [6, 18, 23, 25], "float32": [6, 18, 20, 21], "shape": [6, 16, 18, 20, 21], "denot": [6, 18, 20, 21, 24], "arrai": [6, 16, 18, 26], "we": [6, 12, 16, 18, 20, 21, 22, 23, 24], "well": 6, "high": [6, 21, 22], "8000002e": 6, "00": 6, "4028235e": 6, "1887903e": 6, "01": 6, "dtype": 6, "low": [6, 21], "northbound_interface_cli": 6, "traslat": 6, "dataformat": 6, "northboundcli": 7, "sever": 7, "repli": 7, "start": [7, 8, 9, 10, 23, 24, 25], "request": [7, 8], "where": [7, 16, 18, 21, 22, 23], "load": [7, 16, 18, 20, 21, 23], "recv": 7, "receiv": [7, 8, 10, 16, 20, 21, 25], "messag": [7, 8, 9, 22], "process_measur": 7, "reply_json": 7, "process": [7, 8, 24, 25], "compris": [8, 15, 23], "core": [8, 22], "These": [8, 26], "establish": [8, 9, 15, 16, 25], "via": [8, 11, 25], "design": [8, 18, 22, 26], "southbound": [8, 10, 12, 15, 16, 22, 25], "serv": [8, 18, 20, 22, 23], "bridg": 8, "facilit": [8, 9, 15, 16, 22], "statist": [8, 23], "keep": [8, 15, 23], "aliv": 8, "period": [8, 9, 17, 19, 20, 21], "dispatch": [8, 9], "hello": [8, 9, 25], "upon": [8, 9], "disengag": 8, "n": [8, 9, 14, 15, 16, 18, 20, 21, 22], "smulat": 8, "instig": 8, "plan": [8, 12, 16], "incorpor": 8, "emul": [8, 15], "testb": [8, 15, 23, 25], "altern": 8, "earmark": 8, "futur": 8, "releas": [8, 12], "depict": [8, 15], "flow": [8, 20, 23], "complet": [8, 25], "cycl": 8, "within": [8, 15, 16, 18, 23, 25], "session": [8, 15, 16, 18, 20, 21, 24], "launch": [8, 9, 16, 25], "env_config": [8, 9, 10, 24, 25], "trigger": [8, 26], "gener": [8, 10, 18, 20, 21, 24, 25], "incom": 8, "onc": [8, 16, 18, 20, 21, 24, 25], "conclud": 8, "map": [8, 12, 15, 16], "onli": [8, 9, 20, 23, 25], "env_sim": [8, 9, 10, 25], "ani": [8, 16, 20], "given": [8, 18, 20, 21], "moment": [8, 18], "cannot": [8, 18, 20, 21, 24], "occur": 8, "simultan": 8, "standpoint": 8, "treat": 8, "both": [8, 16, 18, 19, 20, 21, 23, 24], "equival": 8, "identifi": 8, "them": [8, 16, 18, 20, 22], "entiti": [8, 9, 22, 25], "networkgymsim": 9, "env_list": [9, 25], "recept": 9, "its": [9, 15, 18, 20, 23], "socket": [9, 10, 11, 25], "ident": [9, 10, 11], "identif": 9, "subsequ": [9, 18, 20, 21, 23, 24], "commenc": 9, "conclus": 9, "close": 9, "reconnect": 9, "point": [9, 18, 20, 21, 23, 24], "perceiv": 9, "divis": 9, "advantag": [9, 26], "straightforward": [9, 16, 25], "expans": 9, "test": [9, 14, 20, 25], "while": [9, 17, 18, 24], "support": [9, 15, 16, 20, 25], "non": [9, 16, 23], "offic": 9, "account": [9, 18], "env_ident": 10, "client_ident": 10, "msg_json": 10, "random": [10, 16, 18, 20, 21], "sampl": [10, 16, 24, 26], "when": [10, 12, 18, 20, 21, 22, 23, 25, 26], "resum": 10, "env_idennt": 10, "env_port": 10, "first": [10, 16, 20, 21, 24], "who": 10, "msg": [10, 25], "cliet": 10, "generate_dummy_measur": 10, "num_us": 10, "ad": 10, "start_simul": 10, "api": [10, 14, 26], "report": 10, "run_one_interv": 10, "interv": [10, 16], "southbound_interfac": 11, "southbound_connect": 11, "indent": 11, "zmq": 11, "manag": [12, 16, 20, 21, 22], "select": [12, 15, 16, 18, 19, 20, 21, 25], "idl": 12, "instanc": [12, 16, 20, 22, 23, 25], "rout": [12, 15], "tabl": 12, "At": [12, 15, 18, 20, 21, 22, 24], "present": [12, 15, 16, 20, 25], "do": 12, "softwar": [12, 22], "email": 13, "github": [13, 18, 20, 21, 25], "real": 14, "world": [14, 22], "dataset": 14, "control": [14, 20, 22], "oper": [14, 18, 20, 21, 22, 24], "difficult": 14, "acquir": 14, "align": [14, 25], "usag": [14, 18], "itself": 14, "enough": 14, "train": [14, 16, 18, 20, 21, 22], "reinforc": [14, 22, 26], "etc": [14, 22], "current": 14, "enabl": [14, 15, 16, 22, 26], "multi": 14, "access": [14, 18, 22, 23, 25], "traffic": [14, 23], "split": [14, 19, 23], "awar": 14, "steer": [14, 19], "cellular": [14, 17, 20, 21], "ran": [14, 16, 22], "slice": 14, "tool": [14, 22], "often": 14, "veri": 14, "complex": 14, "especi": 14, "research": [14, 15, 16, 22], "without": [14, 20, 22], "expertis": [14, 22], "lack": [14, 20, 23], "common": 14, "simpl": [14, 16], "evalu": [14, 20, 25], "benchmark": 14, "adher": [14, 18], "addition": [14, 15, 16, 25], "offer": [14, 15, 22, 23, 26], "framework": [15, 22], "consist": [15, 16, 22, 23], "essenti": [15, 16, 22, 25], "each": [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26], "plai": [15, 22], "crucial": [15, 22], "role": [15, 22, 26], "system": [15, 16, 18, 22, 23], "encompass": 15, "seamless": 15, "interact": [15, 22, 24, 25, 26], "displai": 15, "below": [15, 16, 23, 24, 26], "graphic": 15, "architectur": [15, 22], "visual": [15, 16], "aid": 15, "divers": [15, 25], "collabor": [15, 16], "harmoni": 15, "form": 15, "streamlin": [15, 22, 25], "effect": [15, 16, 22], "servic": [15, 17, 18, 20, 22], "tailor": [15, 18, 22], "advanc": 15, "ai": [15, 16], "develop": [15, 16, 22], "By": [15, 18, 22], "click": 15, "blue": 15, "navig": 15, "directli": 15, "page": [15, 22], "respect": [15, 16, 18], "main": 15, "respons": 15, "allow": [15, 16, 22, 26], "compat": 15, "like": [15, 18, 22], "stabl": [15, 22], "baselines3": [15, 22], "cleanrl": [15, 22], "desir": [15, 20], "central": 15, "maintain": [15, 22, 23], "track": 15, "assign": [15, 18, 20, 21, 25], "dure": [15, 20], "either": [15, 16, 18, 20, 21], "through": [15, 16, 18, 20, 21, 22, 24, 25], "distinct": [15, 18, 22], "machin": [16, 18, 20, 21, 22], "requst": 16, "mlwin": 16, "ring": 16, "univers": 16, "public": [16, 22], "internet": [16, 22], "intel": 16, "issu": [16, 23], "feel": 16, "free": 16, "u": [16, 25], "netaigym": [16, 25], "gmail": [16, 25], "com": [16, 25], "sim": 16, "aa": 16, "devcloud": 16, "avail": [16, 20, 22, 26], "meanwhil": [16, 18], "enhanc": 16, "capabl": 16, "5g": 16, "distribut": [16, 18, 20, 21], "energi": 16, "save": 16, "predict": 16, "more": [16, 18, 20, 21, 22], "gain": 16, "begin": 16, "download": [16, 18, 20, 21], "your": [16, 22, 23], "prompt": 16, "collect": [16, 22, 26], "forward": [16, 25], "norhtbound": 16, "nb": 16, "algorithm": [16, 18, 22], "store": 16, "relev": 16, "transmit": [16, 18, 20, 21, 23, 25], "sb": [16, 25], "continu": [16, 18, 20, 21, 24], "conveni": 16, "websit": 16, "demonstr": [16, 24, 25], "packag": 16, "networkgymenv": [16, 18, 20, 21, 24], "client_id": [16, 18, 20, 21, 24], "argument": 16, "classic": 16, "loop": [16, 22], "implement": [16, 18, 20, 22], "load_config_fil": [16, 18, 20, 21, 24], "env_nam": [16, 24, 25], "nqos_split": [16, 21, 24], "num_step": [16, 24], "1000": [16, 24], "rang": [16, 18, 23, 24, 26], "exit": [16, 18, 20, 21, 24], "break": [16, 24], "epsiod": [16, 24], "up": [16, 24], "still": [16, 24], "anoth": [16, 24], "keyword": 16, "associ": 16, "dedic": [16, 17, 18], "worker": 16, "until": 16, "parallel": 16, "obtain": 16, "perform": [16, 17, 19, 20, 21, 24], "As": 16, "along": 16, "One": [16, 23], "multipl": [16, 18, 20, 21], "fix": 16, "restart": 16, "scenario": [16, 20, 22, 23], "sequenti": 16, "success": 16, "insight": 16, "time": [16, 18, 20, 21, 23], "constraint": [16, 18, 20], "found": 16, "handl": [16, 18, 20, 21], "limit": [16, 18, 20, 21, 25], "illustr": [16, 23, 24], "everi": [16, 18, 20, 21], "attribut": 16, "understand": 16, "expect": [16, 25], "output": [16, 23, 25], "instead": 16, "prefer": 16, "empti": [16, 22, 26], "shown": [16, 25, 26], "np": [16, 26], "inherit": 16, "major": 16, "possibl": [16, 20], "might": [16, 23], "describ": 16, "dimension": 16, "upper": 16, "lower": 16, "our": [16, 18, 22, 25], "shift": 16, "tupl": 16, "multibinari": 16, "binari": 16, "multidiscret": [16, 20], "wrapper": [16, 18, 20, 21], "maximum": [16, 18, 20, 23], "clipact": 16, "clip": 16, "li": 16, "rescaleact": [16, 18, 20, 21], "rescal": [16, 18, 20, 21], "lie": 16, "timeawareobserv": 16, "about": [16, 18, 20, 21, 22], "index": 16, "ensur": [16, 18, 20, 21, 23], "transit": 16, "markov": 16, "flattenobserv": 16, "flatten": 16, "normalizeobserv": [16, 18, 20, 21], "normal": [16, 18, 20, 21], "t": [16, 18, 25], "coordin": [16, 23], "center": [16, 22], "unit": [16, 25], "varianc": 16, "wrap": 16, "arg": 16, "normal_obs_env": 16, "among": [17, 18], "priorit": [17, 18, 20], "share": [17, 18, 25], "strive": [17, 18], "meet": [17, 18, 20, 23], "level": [17, 18, 20], "agreement": [17, 18], "entir": [18, 20, 21, 24], "partit": [18, 22], "percept": 18, "possess": 18, "abil": 18, "great": 18, "effici": [18, 20], "belong": 18, "mac": 18, "schedul": [18, 20], "proport": 18, "fair": 18, "guarante": 18, "equit": 18, "imparti": 18, "inf": [18, 20, 21], "config": [18, 20, 21], "network_sl": 18, "pose": 18, "challeng": [18, 20], "compet": 18, "finit": 18, "primari": [18, 20], "strateg": [18, 21], "vlab": [18, 20, 21, 25], "multidimension": 18, "ndarrai": [18, 20, 21], "five": 18, "total": [18, 20], "mbp": [18, 20, 21, 25], "fraction": 18, "express": 18, "percentag": [18, 23], "sum": 18, "across": [18, 20], "equal": [18, 21, 23], "averag": 18, "violat": [18, 20, 23], "wise": 18, "record": 18, "experienc": 18, "millisecond": 18, "min": [18, 20, 21], "max": [18, 20, 21], "detail": [18, 20, 21, 22, 26], "note": [18, 20, 21, 23, 24], "exce": 18, "surpass": 18, "appropri": 18, "scale": 18, "down": 18, "softmax": 18, "mathemat": 18, "sum_": 18, "a_i": 18, "quad": 18, "frac": 18, "j": 18, "a_j": 18, "num": [18, 21], "factor": 18, "cost": 18, "formul": 18, "left": 18, "text": 18, "_i": 18, "lambda": 18, "cdot": 18, "delay_violation_r": 18, "gamma": 18, "rb_usage_r": 18, "adjust": [18, 20, 25], "emphasi": 18, "consider": 18, "repo": [18, 20, 21, 25], "uniform": [18, 20, 21], "2d": [18, 20, 21], "plane": [18, 20, 21], "x": [18, 20, 21, 23], "y": [18, 20, 21, 23], "boundari": [18, 20, 21], "instal": [18, 20, 21, 25], "walk": [18, 20, 21], "mobil": [18, 20, 21], "model": [18, 20, 21, 22], "episodes_per_sess": [18, 20, 21, 24], "steps_per_episod": [18, 20, 21, 24], "l": [18, 20, 21, 24], "happen": [18, 20, 21], "length": [18, 20, 21, 24], "reconfigur": [18, 20, 21, 24], "program": [18, 20, 21, 22, 24], "mx": [19, 20, 21], "ratio": [19, 21, 23], "consid": [19, 20, 21, 23], "lte": [19, 20, 21, 23, 25], "link": [19, 20, 21, 23, 25], "part": [20, 21], "dimens": 20, "qos_steer": 20, "randomli": [20, 21], "intellig": 20, "direct": [20, 22, 23, 25], "aim": [20, 21], "achiev": [20, 21, 23], "best": 20, "qualiti": 20, "regard": 20, "halt": 20, "admiss": 20, "capac": [20, 21, 23], "10": [20, 23, 25], "accommod": [20, 22], "drop": [20, 23], "remain": 20, "On": 20, "hand": 20, "contend": 20, "restrict": 20, "qos_requir": 20, "test_duration_m": 20, "500": 20, "durat": 20, "delay_bound_m": [20, 23], "100": [20, 23], "delay_violation_target": 20, "02": 20, "target": 20, "loss_target": 20, "001": 20, "loss": 20, "packet": [20, 23], "otherwis": 20, "met": 20, "set": 20, "zero": 20, "estim": [20, 21], "channel": [20, 21, 22], "third": [20, 21], "combin": [20, 21, 23], "mechan": 20, "maxim": [20, 21], "lead": 20, "essenc": 20, "optim": [20, 22, 26], "indirectli": 20, "overal": 20, "problem": 21, "station": 21, "closest": 21, "handov": 21, "disabl": 21, "latenc": 21, "transmitt": 21, "f": 21, "owd": [21, 23, 25], "innov": 22, "concept": 22, "open": 22, "yield": 22, "wherea": 22, "flexibl": [22, 26], "languag": 22, "platform": 22, "separ": 22, "freedom": 22, "emploi": [22, 23], "variou": 22, "smoothli": 22, "c": 22, "leverag": 22, "prevent": 22, "secur": 22, "oversight": 22, "independ": 22, "deploy": 22, "deploi": 22, "workload": 22, "approach": 22, "thei": 22, "four": 22, "purpos": [22, 26], "offlin": [22, 26], "own": [22, 26], "special": [22, 26], "art": [22, 26], "sota": [22, 26], "tutori": [22, 25, 26], "guidanc": 22, "instruct": [22, 25, 26], "convers": 22, "comprehens": 22, "kei": 22, "overview": 22, "focus": 22, "layer": [22, 23], "involv": [22, 23, 25], "abstract": 22, "power": 22, "aspect": 22, "endeavor": 22, "full": 22, "stack": 22, "edg": 22, "cloud": 22, "fidel": 22, "proprietari": [22, 25], "applic": [22, 23], "xapp": 22, "rapp": 22, "ric": 22, "digit": 22, "twin": [22, 26], "person": 23, "match": 23, "experiment": 23, "cid": [23, 25], "end_t": [23, 25], "start_t": [23, 25], "dl": [23, 25], "6000": 23, "gma": [23, 25], "ap_id": 23, "5900": 23, "255": 23, "delay_viol": 23, "max_owd": 23, "335": 23, "703": 23, "422": 23, "299": 23, "6": [23, 25], "phy": [23, 25], "max_rat": [23, 25], "35": 23, "22": 23, "7": [23, 25], "78": 23, "65": 23, "8": [23, 25], "measurement_ok": 23, "9": [23, 25], "missed_act": 23, "327": 23, "680": 23, "403": 23, "279": 23, "11": 23, "404": 23, "280": 23, "12": 23, "13": 23, "qos_mark": 23, "14": 23, "15": 23, "16": 23, "17": 23, "18": 23, "912": 23, "056": 23, "984": 23, "19": 23, "472": 23, "336": 23, "20": 23, "696": 23, "64": 23, "016": 23, "992": 23, "21": 23, "split_ratio": [23, 25], "31": 23, "23": 23, "traffic_ratio": 23, "92": 23, "63": 23, "24": 23, "36": 23, "37": 23, "25": 23, "tx_rate": 23, "075": 23, "408": 23, "434": 23, "797": 23, "26": 23, "x_loc": 23, "040140997999378": 23, "710302486045565": 23, "52": 23, "547": 23, "27": 23, "y_loc": 23, "167369006263322": 23, "450729590703729": 23, "45877": 23, "field": 23, "explan": 23, "signifi": 23, "downlink": 23, "ul": 23, "uplink": 23, "converg": 23, "now": 23, "elabor": 23, "cell": 23, "reorder": 23, "order": 23, "count": 23, "too": 23, "long": 23, "wait": 23, "therefor": 23, "alwai": 23, "deliveri": 23, "32": 23, "cover": 23, "34": 23, "sinc": 23, "sine": 23, "To": [23, 26], "df_rate": 23, "reset_index": 23, "isol": 23, "execut": 23, "lastli": 23, "explod": 23, "frame": 23, "origin": 23, "structur": 23, "final": 23, "464": 23, "968": 23, "28": 23, "occasion": 23, "absent": 23, "address": 23, "popul": 23, "modifi": [23, 25, 26], "section": [24, 25], "outlin": 24, "showcas": 24, "inclus": 25, "extern": 25, "equip": 25, "ll": 25, "ultim": 25, "merg": 25, "procedur": 25, "setup": 25, "port": 25, "alter": 25, "8087": 25, "session_nam": 25, "session_kei": 25, "network_gym_env": 25, "common_config": 25, "accord": 25, "start_custom_env": 25, "py": 25, "would": 25, "don": 25, "grant": 25, "demo": [25, 26], "Then": 25, "start_client_demo": 25, "print": 25, "custom_act": 25, "custom_tag": 25, "9269856811": 25, "5833047032": 25, "6873341799": 25, "0909367353": 25, "3403381109": 25, "0730143189": 25, "4166952968": 25, "3126658201": 25, "9090632796": 25, "6596618891": 25, "20000": 25, "21000": 25, "sole": 25, "ve": 25, "re": 25, "readi": 25, "mirror": 25, "uml": 25, "sequenc": 25, "diagram": 25, "locat": 25, "experi": 25, "contact": 25, "integr": [25, 26], "fulfil": 26, "simpli": 26, "popular": 26, "ones": 26, "ppo": 26, "proxim": 26, "ddpg": 26, "deep": 26, "determinist": 26, "gradient": 26, "sac": 26, "soft": 26, "actor": 26, "critic": 26, "td3": 26, "a2c": 26, "moreov": 26, "seamlessli": 26}, "objects": {"network_gym_client": [[2, 0, 1, "", "Adapter"], [6, 0, 1, "", "Env"], [7, 0, 1, "", "NorthBoundClient"]], "network_gym_client.Adapter": [[2, 1, 1, "", "df_to_dict"], [2, 1, 1, "", "fill_empty_feature"], [2, 1, 1, "", "get_nested_json_policy"], [2, 1, 1, "", "wandb_log"], [2, 1, 1, "", "wandb_log_buffer_append"]], "network_gym_client.Env": [[6, 2, 1, "", "action_space"], [6, 2, 1, "", "adapter"], [6, 2, 1, "", "northbound_interface_client"], [6, 2, 1, "", "observation_space"], [6, 1, 1, "", "reset"], [6, 1, 1, "", "step"]], "network_gym_client.NorthBoundClient": [[7, 1, 1, "", "connect"], [7, 1, 1, "", "process_measurement"], [7, 1, 1, "", "recv"], [7, 1, 1, "", "send"]], "network_gym_client.envs.network_slicing": [[3, 0, 1, "", "Adapter"]], "network_gym_client.envs.network_slicing.Adapter": [[3, 1, 1, "", "get_action_space"], [3, 1, 1, "", "get_observation"], [3, 1, 1, "", "get_observation_space"], [3, 1, 1, "", "get_policy"], [3, 1, 1, "", "get_rbg_size"], [3, 1, 1, "", "get_reward"]], "network_gym_client.envs.nqos_split": [[4, 0, 1, "", "Adapter"]], "network_gym_client.envs.nqos_split.Adapter": [[4, 1, 1, "", "get_action_space"], [4, 1, 1, "", "get_observation"], [4, 1, 1, "", "get_observation_space"], [4, 1, 1, "", "get_policy"], [4, 1, 1, "", "get_reward"], [4, 1, 1, "", "netowrk_util"]], "network_gym_client.envs.qos_steer": [[5, 0, 1, "", "Adapter"]], "network_gym_client.envs.qos_steer.Adapter": [[5, 1, 1, "", "calculate_wifi_qos_user_num"], [5, 1, 1, "", "get_action_space"], [5, 1, 1, "", "get_observation"], [5, 1, 1, "", "get_observation_space"], [5, 1, 1, "", "get_policy"], [5, 1, 1, "", "get_reward"]], "network_gym_env": [[9, 0, 1, "", "Configure"], [10, 0, 1, "", "DummySim"]], "network_gym_env.Configure": [[9, 1, 1, "", "run"]], "network_gym_env.DummySim": [[10, 1, 1, "", "generate_dummy_measurement"], [10, 1, 1, "", "run_one_interval"], [10, 1, 1, "", "start_simulation"]], "network_gym_env.southbound_interface": [[11, 1, 1, "", "southbound_connect"]]}, "objtypes": {"0": "py:class", "1": "py:function", "2": "py:attribute"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "function", "Python function"], "2": ["py", "attribute", "Python attribute"]}, "titleterms": {"build": 0, "document": 0, "websit": 0, "instal": 0, "depend": 0, "us": 0, "tip": 0, "auto": 0, "gener": 0, "rst": 0, "file": 0, "add": 0, "class": [0, 2], "function": 0, "md": 0, "network_gym_cli": [1, 6, 7], "adapt": [2, 3, 4, 5], "The": 2, "base": 2, "method": [2, 3, 4, 5, 6, 7, 9, 10, 11], "network_sl": 3, "reward": [3, 4, 5, 18, 20, 21, 23], "addit": [3, 4, 5, 7], "nqos_split": 4, "qos_steer": 5, "env": 6, "attribut": 6, "northbound": 7, "network_gym_env": [8, 9, 10, 11], "networkgym": [8, 14, 15, 16, 22], "uml": 8, "sequenc": 8, "diagram": 8, "configur": 9, "dummi": [10, 25], "simul": [10, 16, 25], "dummysim": 10, "southbound": 11, "network_gym_serv": 12, "contact": 13, "motiv": 14, "network": [14, 17, 18, 22], "ai": [14, 22], "model": 14, "algorithm": [14, 26], "develop": 14, "cycl": 14, "challeng": 14, "face": 14, "": 14, "approach": 14, "address": 14, "thi": 14, "overview": 15, "compon": 15, "interfac": 15, "client": [15, 16], "api": [15, 22], "server": 15, "environ": [15, 16, 25], "quickstart": 16, "access": [16, 20, 21], "servic": 16, "via": 16, "vlab": 16, "basic": 16, "usag": 16, "upon": 16, "start": [16, 18, 20, 21], "follow": 16, "seri": 16, "step": 16, "occur": 16, "dure": 16, "process": 16, "repeat": 16, "when": 16, "conclud": 16, "initi": [16, 25], "interact": 16, "explain": 16, "code": [16, 24], "action": [16, 18, 20, 21], "observ": [16, 18, 20, 21, 23], "space": [16, 18, 20, 21], "modifi": 16, "slice": [17, 18], "cellular": 18, "descript": [18, 20, 21], "prerequisit": [18, 20, 21], "argument": [18, 20, 21], "state": [18, 20, 21], "episod": [18, 20, 21], "end": [18, 20, 21], "traffic": [19, 20, 21], "manag": 19, "multi": [20, 21], "qo": 20, "steer": 20, "split": 21, "transit": 21, "dynam": 21, "democrat": 22, "benefit": 22, "agent": [22, 26], "gymnasium": 22, "scope": 22, "limit": [22, 24], "custom": [23, 25, 26], "work": 23, "measur": 23, "column": 23, "row": 23, "retriev": 23, "fill": 23, "miss": 23, "data": 23, "handl": 24, "time": 24, "truncat": 24, "termin": 24, "sequenti": 24, "train": [24, 26], "exampl": 24, "python": 24, "implement": 25, "your": 25, "connect": 25, "substitut": 25, "releas": 25, "system": 26, "default": 26, "stabl": 26, "baselines3": 26, "cleanrl": 26}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"Build Documentation Website": [[0, "build-documentation-website"]], "Install Dependencies": [[0, "install-dependencies"]], "Build Website": [[0, "build-website"]], "Useful Tips": [[0, "useful-tips"]], "Auto Generate rst Files": [[0, "auto-generate-rst-files"]], "Add Classes and Functions to md Files": [[0, "add-classes-and-functions-to-md-files"]], "network_gym_client": [[1, "network-gym-client"]], "Adapter": [[2, "adapter"]], "The Base Class": [[2, "the-base-class"]], "Methods": [[2, "methods"], [3, "methods"], [4, "methods"], [5, "methods"], [6, "methods"], [7, "methods"], [9, "methods"], [10, "methods"], [11, "methods"]], "network_slicing Adapter": [[3, "network-slicing-adapter"]], "": [[3, "id1"], [4, "id1"], [5, "id1"]], "Reward Methods": [[3, "reward-methods"], [5, "reward-methods"]], "Additional Methods": [[3, "additional-methods"], [4, "additional-methods"], [5, "additional-methods"], [7, "additional-methods"]], "nqos_split Adapter": [[4, "nqos-split-adapter"]], "Reward Method": [[4, "reward-method"]], "qos_steer Adapter": [[5, "qos-steer-adapter"]], "Env": [[6, "env"]], "network_gym_client.Env": [[6, "network-gym-client-env"]], "Attributes": [[6, "attributes"]], "NorthBound": [[7, "northbound"]], "network_gym_client.NorthBound": [[7, "network-gym-client-northbound"]], "network_gym_env": [[8, "network-gym-env"]], "NetworkGym UML Sequence Diagram": [[8, "networkgym-uml-sequence-diagram"]], "Configure": [[9, "configure"]], "network_gym_env.Configure": [[9, "network-gym-env-configure"]], "Dummy Simulator": [[10, "dummy-simulator"]], "network_gym_env.DummySim": [[10, "network-gym-env-dummysim"]], "SouthBound": [[11, "southbound"]], "network_gym_env.SouthBound": [[11, "network-gym-env-southbound"]], "network_gym_server": [[12, "network-gym-server"]], "Contact": [[13, "contact"]], "Motivation": [[14, "motivation"]], "Network AI Models/Algorithms Development Cycle": [[14, "network-ai-models-algorithms-development-cycle"]], "Challenges Faced by Network AI Developers": [[14, "challenges-faced-by-network-ai-developers"]], "NetworkGym\u2019s Approach to Addressing this Challenge": [[14, null], [14, null], [14, null]], "Overview": [[15, "overview"]], "NetworkGym Components and Interfaces": [[15, "networkgym-components-and-interfaces"]], "Client API": [[15, "client-api"]], "Server API": [[15, "server-api"]], "Environment API": [[15, "environment-api"]], "Quickstart": [[16, "quickstart"]], "Accessing the NetworkGym Service via vLab": [[16, "accessing-the-networkgym-service-via-vlab"]], "Basic Usage": [[16, "basic-usage"]], "\u25b6\ufe0f Upon starting the Client, the following series of steps occur:": [[16, null]], "\ud83d\udd01 During the simulation, the process repeats as follows:": [[16, null]], "\u23f9\ufe0f When the NetworkGym or the simulation concludes:": [[16, null]], "Initializing Environments": [[16, "initializing-environments"]], "Interacting with the Environment": [[16, "interacting-with-the-environment"]], "Explaining the code": [[16, "explaining-the-code"]], "Action and observation spaces": [[16, "action-and-observation-spaces"]], "Modifying the environment": [[16, "modifying-the-environment"]], "Network Slicing": [[17, "network-slicing"]], "Cellular Network Slicing": [[18, "cellular-network-slicing"]], "Description": [[18, "description"], [20, "description"], [21, "description"]], "Prerequisite": [[18, "prerequisite"], [20, "prerequisite"], [21, "prerequisite"]], "Observation Space": [[18, "observation-space"], [20, "observation-space"], [21, "observation-space"]], "Action Space": [[18, "action-space"], [20, "action-space"], [21, "action-space"]], "Reward": [[18, "reward"], [20, "reward"], [21, "reward"]], "Arguments": [[18, "arguments"], [20, "arguments"], [21, "arguments"]], "Starting State": [[18, "starting-state"], [20, "starting-state"], [21, "starting-state"]], "Episode End": [[18, "episode-end"], [20, "episode-end"], [21, "episode-end"]], "Traffic Management": [[19, "traffic-management"]], "Multi-Access QoS Traffic Steering": [[20, "multi-access-qos-traffic-steering"]], "Multi-Access Traffic Splitting": [[21, "multi-access-traffic-splitting"]], "Transition Dynamics": [[21, "transition-dynamics"]], "NetworkGym: Democratizing Network AI": [[22, "networkgym-democratizing-network-ai"]], "Benefits of NetworkGym": [[22, "benefits-of-networkgym"]], "Agent": [[22, "agent"]], "Gymnasium API": [[22, "gymnasium-api"]], "NetworkGym API": [[22, "networkgym-api"]], "NetworkGym Scope and Limitations": [[22, "networkgym-scope-and-limitations"]], "Customizing Observation and Reward": [[23, "customizing-observation-and-reward"]], "Working with the Measurement": [[23, "working-with-the-measurement"]], "Measurement Columns": [[23, "measurement-columns"]], "Measurement Rows": [[23, "measurement-rows"]], "Retrieving a Measurement": [[23, "retrieving-a-measurement"]], "Filling the Missing Data": [[23, "filling-the-missing-data"]], "Handling Time Limits": [[24, "handling-time-limits"]], "Truncation": [[24, "truncation"]], "Termination": [[24, "termination"]], "Sequential Training Example": [[24, "sequential-training-example"]], "Python code:": [[24, "python-code"]], "Implementing Custom Environment": [[25, "implementing-custom-environment"]], "Initiating your Custom Environment": [[25, "initiating-your-custom-environment"]], "Connecting to Your Custom Environment": [[25, "connecting-to-your-custom-environment"]], "Substituting the Dummy Simulator": [[25, "substituting-the-dummy-simulator"]], "Releasing Your Custom Environment": [[25, "releasing-your-custom-environment"]], "Training Agents": [[26, "training-agents"]], "System Default Agent": [[26, "system-default-agent"]], "Custom Algorithm Agent": [[26, "custom-algorithm-agent"]], "Stable-Baselines3 Agent": [[26, "stable-baselines3-agent"]], "CleanRL Agent": [[26, "cleanrl-agent"]]}, "indexentries": {"adapter (class in network_gym_client)": [[2, "network_gym_client.Adapter"]], "df_to_dict() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.df_to_dict"]], "fill_empty_feature() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.fill_empty_feature"]], "get_nested_json_policy() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.get_nested_json_policy"]], "wandb_log() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.wandb_log"]], "wandb_log_buffer_append() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.wandb_log_buffer_append"]], "adapter (class in network_gym_client.envs.network_slicing)": [[3, "network_gym_client.envs.network_slicing.Adapter"]], "get_action_space() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_action_space"]], "get_observation() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_observation"]], "get_observation_space() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_observation_space"]], "get_policy() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_policy"]], "get_rbg_size() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_rbg_size"]], "get_reward() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_reward"]], "adapter (class in network_gym_client.envs.nqos_split)": [[4, "network_gym_client.envs.nqos_split.Adapter"]], "get_action_space() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_action_space"]], "get_observation() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_observation"]], "get_observation_space() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_observation_space"]], "get_policy() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_policy"]], "get_reward() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_reward"]], "netowrk_util() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.netowrk_util"]], "adapter (class in network_gym_client.envs.qos_steer)": [[5, "network_gym_client.envs.qos_steer.Adapter"]], "calculate_wifi_qos_user_num() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.calculate_wifi_qos_user_num"]], "get_action_space() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_action_space"]], "get_observation() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_observation"]], "get_observation_space() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_observation_space"]], "get_policy() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_policy"]], "get_reward() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_reward"]], "env (class in network_gym_client)": [[6, "network_gym_client.Env"]], "action_space (network_gym_client.env attribute)": [[6, "network_gym_client.Env.action_space"]], "adapter (network_gym_client.env attribute)": [[6, "network_gym_client.Env.adapter"]], "northbound_interface_client (network_gym_client.env attribute)": [[6, "network_gym_client.Env.northbound_interface_client"]], "observation_space (network_gym_client.env attribute)": [[6, "network_gym_client.Env.observation_space"]], "reset() (in module network_gym_client.env)": [[6, "network_gym_client.Env.reset"]], "step() (in module network_gym_client.env)": [[6, "network_gym_client.Env.step"]], "northboundclient (class in network_gym_client)": [[7, "network_gym_client.NorthBoundClient"]], "connect() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.connect"]], "process_measurement() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.process_measurement"]], "recv() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.recv"]], "send() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.send"]], "configure (class in network_gym_env)": [[9, "network_gym_env.Configure"]], "run() (in module network_gym_env.configure)": [[9, "network_gym_env.Configure.run"]], "dummysim (class in network_gym_env)": [[10, "network_gym_env.DummySim"]], "generate_dummy_measurement() (in module network_gym_env.dummysim)": [[10, "network_gym_env.DummySim.generate_dummy_measurement"]], "run_one_interval() (in module network_gym_env.dummysim)": [[10, "network_gym_env.DummySim.run_one_interval"]], "start_simulation() (in module network_gym_env.dummysim)": [[10, "network_gym_env.DummySim.start_simulation"]], "southbound_connect() (in module network_gym_env.southbound_interface)": [[11, "network_gym_env.southbound_interface.southbound_connect"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["README", "api/network_gym_client", "api/network_gym_client/adapter", "api/network_gym_client/adapter/network_slicing", "api/network_gym_client/adapter/nqos_split", "api/network_gym_client/adapter/qos_steer", "api/network_gym_client/env", "api/network_gym_client/northbound_interface", "api/network_gym_env", "api/network_gym_env/configure", "api/network_gym_env/simulator", "api/network_gym_env/southbound_interface", "api/network_gym_server", "contact", "content/motivation", "content/overview", "content/quickstart", "environments/mx_network_slicing", "environments/mx_network_slicing/cellular_network_slicing", "environments/mx_traffic_management", "environments/mx_traffic_management/mx_qos_traffic_steering", "environments/mx_traffic_management/mx_traffic_splitting", "index", "tutorials/customizing_observation_and_reward", "tutorials/handling_time_limits", "tutorials/implementing_custom_environment", "tutorials/training_agents"], "filenames": ["README.md", "api/network_gym_client.md", "api/network_gym_client/adapter.md", "api/network_gym_client/adapter/network_slicing.md", "api/network_gym_client/adapter/nqos_split.md", "api/network_gym_client/adapter/qos_steer.md", "api/network_gym_client/env.md", "api/network_gym_client/northbound_interface.md", "api/network_gym_env.md", "api/network_gym_env/configure.md", "api/network_gym_env/simulator.md", "api/network_gym_env/southbound_interface.md", "api/network_gym_server.md", "contact.md", "content/motivation.md", "content/overview.md", "content/quickstart.md", "environments/mx_network_slicing.md", "environments/mx_network_slicing/cellular_network_slicing.md", "environments/mx_traffic_management.md", "environments/mx_traffic_management/mx_qos_traffic_steering.md", "environments/mx_traffic_management/mx_traffic_splitting.md", "index.md", "tutorials/customizing_observation_and_reward.md", "tutorials/handling_time_limits.md", "tutorials/implementing_custom_environment.md", "tutorials/training_agents.md"], "titles": ["Build Documentation Website", "network_gym_client", "Adapter", "network_slicing Adapter", "nqos_split Adapter", "qos_steer Adapter", "Env", "NorthBound", "network_gym_env", "Configure", "Dummy Simulator", "SouthBound", "network_gym_server", "Contact", "Motivation", "Overview", "Quickstart", "Network Slicing", "Cellular Network Slicing", "Traffic Management", "Multi-Access QoS Traffic Steering", "Multi-Access Traffic Splitting", "NetworkGym: Democratizing Network AI", "Customizing Observation and Reward", "Handling Time Limits", "Implementing Custom Environment", "Training Agents"], "terms": {"option": [0, 1, 6, 16, 18, 20, 21, 22, 23, 24], "creat": [0, 10, 16, 22, 25, 26], "new": [0, 10, 16, 23], "virtual": 0, "python": [0, 16, 22], "environ": [0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 20, 21, 22, 23, 24, 26], "python3": [0, 25], "m": [0, 18, 25], "venv": 0, "sphinx_venv": 0, "sourc": [0, 2, 3, 4, 5, 6, 7, 9, 10, 11, 22, 26], "bin": 0, "activ": [0, 8, 15, 16, 26], "requir": [0, 14, 20, 22, 23], "librari": 0, "pip": 0, "r": [0, 18, 21], "txt": 0, "In": [0, 8, 16, 17, 18, 19, 20, 21, 22, 24, 25], "doc": 0, "folder": 0, "run": [0, 6, 9, 10, 16, 18, 20, 21, 24], "follow": [0, 1, 6, 9, 18, 20, 21, 22, 23, 25], "command": [0, 25], "export": 0, "static": 0, "_build": 0, "html": 0, "make": [0, 16, 23], "clean": 0, "network_gym_cli": [0, 2, 3, 4, 5, 16, 18, 20, 21, 23, 24], "The": [0, 1, 6, 8, 9, 10, 12, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26], "contain": [0, 6, 16, 18, 23], "modul": [0, 8], "rm": 0, "sphinx": 0, "apidoc": 0, "o": [0, 16, 22], "d": 0, "2": [0, 6, 18, 20, 21, 22, 23, 25], "markdown": 0, "e": [0, 1, 6, 9, 10, 14, 18, 20, 21, 22, 24], "g": [0, 1, 6, 9, 10, 14, 20, 21, 22], "eval": 0, "autoclass": 0, "env": [0, 1, 3, 4, 5, 7, 8, 9, 10, 16, 18, 20, 21, 24, 25, 26], "networkgym": [1, 6, 7, 12, 18, 20, 21, 24, 25, 26], "client": [1, 6, 7, 8, 9, 10, 12, 18, 20, 21, 22, 25], "includ": [1, 12, 16, 22, 23, 26], "three": [1, 15, 18, 20, 21, 22, 24], "compon": [1, 8, 9, 12, 22], "custom": [1, 2, 6, 9, 15, 16, 18, 20, 21, 22, 24], "gymnasium": [1, 2, 6, 14, 15, 16, 26], "adapt": [1, 6, 15, 18, 20, 21, 23, 25], "northbound": [1, 6, 12, 15, 16, 22], "interfac": [1, 6, 7, 8, 11, 12, 16, 22, 25], "inheret": 1, "class": [1, 3, 4, 5, 6, 7, 9, 10, 16, 23, 25], "commun": [1, 6, 8, 15, 16], "agent": [1, 2, 3, 4, 5, 6, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25], "us": [1, 6, 9, 10, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26], "standard": [1, 14, 22, 25], "exchang": [1, 8, 9, 16, 22], "ob": [1, 2, 6, 16, 24], "reward": [1, 2, 6, 16, 22, 24], "action": [1, 2, 3, 4, 5, 6, 8, 9, 10, 17, 19, 22, 23, 24, 25, 26], "reset": [1, 6, 16, 24], "step": [1, 6, 18, 20, 21, 24, 25], "function": [1, 2, 3, 4, 5, 16, 18, 20, 21, 23], "import": [1, 16, 18, 20, 21, 24], "gym": [1, 6, 7, 22], "def": 1, "__init__": 1, "self": [1, 2, 3, 4, 5, 6, 7, 9, 10], "arg1": 1, "arg2": 1, "super": 1, "return": [1, 2, 3, 4, 5, 6, 7, 10, 11, 16], "observ": [1, 3, 4, 5, 6, 22, 26], "termin": [1, 6, 8, 9, 10, 16, 18, 20, 21, 25], "truncat": [1, 6, 16, 18, 20, 21], "info": [1, 2, 6, 16, 24, 25, 26], "seed": [1, 6], "none": [1, 6], "transform": [1, 2, 15, 23], "data": [1, 2, 5, 8, 15, 16, 18, 20, 22, 25, 26], "format": [1, 2, 15, 16, 22, 25], "from": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 18, 22, 23, 24, 26], "network_gym": [1, 2, 6], "other": [1, 9, 20, 24], "wai": [1, 6, 21, 23], "around": [1, 22], "network": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 20, 21, 23, 25, 26], "stat": [1, 2, 3, 4, 5, 7, 10, 22], "chang": [1, 24], "polici": [1, 2, 3, 4, 5, 7, 8, 16, 26], "connect": [1, 6, 7, 8, 9, 10, 11, 12, 15, 16, 19, 20, 21, 22, 23], "server": [1, 6, 7, 8, 9, 10, 11, 12, 16, 18, 20, 21, 22, 25], "configur": [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 14, 15, 16, 18, 20, 21, 22, 23, 24], "paramet": [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 18, 20, 21, 24], "between": [1, 2, 6, 8, 9, 15, 21, 22, 25], "envrion": [1, 12], "config_json": [2, 3, 4, 5, 6, 7, 10, 11, 16, 18, 20, 21, 24], "thi": [2, 3, 4, 5, 6, 8, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], "i": [2, 3, 4, 6, 7, 9, 10, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26], "an": [2, 6, 8, 9, 12, 14, 15, 16, 18, 20, 21, 22, 23, 24, 26], "It": [2, 6, 8, 15, 16, 18, 20, 21, 22, 24], "measur": [2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 18, 20, 21, 25], "json": [2, 3, 4, 5, 6, 7, 10, 11, 16, 18, 20, 21, 23, 24, 25], "space": [2, 3, 4, 5, 6], "also": [2, 6, 14, 16, 18, 20, 21, 22, 23, 24, 25], "can": [2, 6, 8, 9, 15, 16, 18, 20, 21, 22, 23, 24, 25, 26], "appli": [2, 23], "initi": [2, 3, 4, 5, 6, 7, 8, 9, 18], "file": [2, 3, 4, 5, 6, 7, 10, 11, 16, 18, 20, 21, 23, 24, 25], "wandb_log_buffer_append": 2, "add": [2, 12, 16], "wandb": [2, 16], "log": [2, 6, 21], "buffer": 2, "send": [2, 6, 7, 8, 10, 16, 22, 23, 25, 26], "later": 2, "wandb_log": 2, "dict": [2, 6, 10, 16], "inform": [2, 6, 16, 20, 21, 22], "append": 2, "df_to_dict": 2, "df": [2, 3, 4, 5, 23], "descript": [2, 23], "datatyp": 2, "panda": [2, 5], "datafram": [2, 3, 4, 5, 7, 23], "dictionari": [2, 6, 16], "object": [2, 6, 18, 23], "string": 2, "descritpt": 2, "convert": 2, "fill_empty_featur": [2, 23], "featur": [2, 3, 4, 5, 18, 20, 21, 23], "valu": [2, 4, 6, 16, 18, 20, 21, 23, 25], "fill": 2, "miss": 2, "input": [2, 16, 23], "pd": [2, 3, 4, 5, 7], "int": [2, 3, 6, 7, 9, 10], "list": [2, 6, 9, 10, 16, 18, 20, 21, 23], "result": [2, 6, 10, 16, 18, 20, 21, 24], "after": [2, 6, 16, 18, 20, 21, 23, 24], "replac": 2, "get_nested_json_polici": 2, "action_nam": 2, "tag": [2, 10, 25], "index_nam": 2, "user": [2, 5, 6, 10, 16, 18, 19, 20, 21, 22, 23, 25, 26], "nest": 2, "str": [2, 9, 10, 11], "name": [2, 9, 10, 16, 23, 25], "rl": [2, 3, 4, 5, 6, 16, 22, 23, 26], "base": [3, 4, 5, 8, 15, 16, 21, 22], "get_observ": [3, 4, 5, 18, 20, 21, 23], "prepar": [3, 4, 5], "should": [3, 4, 5, 6, 16, 18, 23, 25], "same": [3, 4, 5, 9, 18, 23, 25], "number": [3, 4, 5, 6, 10, 16, 18, 20, 21, 23, 24, 25], "defin": [3, 4, 5, 6, 16, 18, 20, 21, 22, 26], "get_observation_spac": [3, 4, 5, 23], "get_reward": [3, 4, 5, 18, 20, 21, 23], "get_polici": [3, 4, 5], "No": [3, 16, 26], "yet": 3, "get_action_spac": [3, 4, 5], "get": [3, 4, 5, 6], "get_rbg_siz": 3, "bandwidth": [3, 20], "comput": [3, 16, 18, 20, 21, 22, 23], "resourc": [3, 17, 18, 20, 21], "block": [3, 18], "group": [3, 18, 23, 25], "size": [3, 23], "bandwith": 3, "rb": [3, 18], "code": [3, 9, 23, 26], "coppi": 3, "ns3": 3, "pf": 3, "type": [3, 6, 16, 22, 25], "0": [3, 4, 6, 16, 18, 20, 21, 23, 24, 25], "alloc": [3, 17, 18], "rbg": 3, "resouc": 3, "netowrk_util": [4, 21], "throughput": [4, 18, 20, 21, 23], "delai": [4, 6, 18, 20, 21, 23, 26], "alpha": 4, "5": [4, 18, 20, 21, 23, 25], "calcul": [4, 5, 20], "util": [4, 9, 15, 18, 20, 21, 22, 23, 25], "specifi": [4, 6, 16, 18, 20, 21, 23, 24], "balanc": 4, "default": [4, 5, 6, 16, 18, 22, 23], "float": 4, "repres": [4, 16, 18, 20, 21, 23], "bit": 4, "per": [4, 5, 18, 20, 21, 23, 24], "second": [4, 16, 20, 21, 24], "metric": [4, 16, 23], "calculate_wifi_qos_user_num": [5, 20], "qos_rat": [5, 20, 23, 25], "qo": [5, 14, 16, 19, 23], "over": [5, 19, 20, 21, 23], "wi": [5, 19, 20, 21, 23, 25], "fi": [5, 19, 20, 21, 23, 25], "rate": [5, 18, 20, 21, 23, 25], "doubl": 5, "id": [6, 7, 9, 23], "initil": [6, 10], "intern": [6, 16], "state": [6, 16, 22, 26], "": [6, 8, 9, 16, 18, 20, 21, 23, 24, 25, 26], "prng": 6, "np_random": 6, "If": [6, 16, 24], "doe": [6, 22], "alreadi": [6, 20], "have": [6, 16, 18, 20, 21, 22, 23, 24, 26], "pass": 6, "chosen": 6, "some": [6, 16, 23], "entropi": 6, "timestamp": [6, 10, 23], "dev": 6, "urandom": 6, "howev": 6, "ha": [6, 16, 18, 20, 21, 24], "you": [6, 15, 16, 18, 20, 21, 23, 24, 25, 26], "integ": 6, "even": 6, "exist": [6, 23], "usual": 6, "want": 6, "right": [6, 18], "been": [6, 16, 26], "never": 6, "again": 6, "pleas": [6, 22, 25], "refer": [6, 16, 18, 20, 21, 22, 24, 25, 26], "minim": [6, 21], "exampl": [6, 16], "abov": [6, 22], "see": [6, 18, 20, 21], "paradigm": 6, "addit": [6, 16, 22], "how": [6, 15, 16, 22, 24, 25], "depend": [6, 25], "specif": [6, 14, 15, 18, 22, 23, 24, 26], "obstyp": 6, "auxiliari": 6, "complement": 6, "analog": 6, "one": [6, 8, 10, 16, 18, 21, 23, 24], "timestep": [6, 16], "dynam": [6, 23], "gamsim": 6, "check": 6, "last": [6, 24], "episod": [6, 16, 24, 25], "done": [6, 16], "acttyp": 6, "provid": [6, 9, 15, 16, 20, 21, 22, 23, 24, 25, 26], "updat": [6, 16, 19, 21, 23], "element": [6, 15, 16], "observation_spac": [6, 16], "next": [6, 16], "due": 6, "supportsfloat": 6, "take": [6, 16, 18, 20, 23], "bool": 6, "whether": 6, "reach": [6, 16, 20], "under": [6, 22], "mdp": 6, "task": [6, 25], "which": [6, 15, 16, 18, 20, 23], "posit": [6, 18, 20, 21], "neg": 6, "goal": [6, 20, 21, 23], "move": 6, "lava": 6, "sutton": 6, "barton": 6, "gridworld": 6, "true": [6, 16], "need": [6, 14, 16, 18, 22], "call": [6, 16], "condit": 6, "outsid": 6, "scope": 6, "satisfi": 6, "typic": 6, "timelimit": [6, 16], "could": [6, 16], "indic": [6, 18, 20], "physic": [6, 22], "go": 6, "out": [6, 16, 22, 23], "bound": [6, 16, 23], "end": [6, 8, 16, 22, 23, 24], "prematur": 6, "befor": 6, "diagnost": 6, "help": [6, 16], "debug": 6, "learn": [6, 14, 22, 25, 26], "raw": 6, "flag": 6, "deprec": 6, "A": [6, 10, 16, 18, 20, 21, 22, 23, 24, 26], "boolean": 6, "case": [6, 14, 16, 18, 22, 23], "further": [6, 16, 18, 20, 21], "undefin": 6, "wa": 6, "remov": 6, "openai": 6, "v26": 6, "favor": 6, "signal": [6, 8, 9, 16, 21], "mai": [6, 16, 24], "emit": 6, "differ": [6, 16, 20, 22, 24], "reason": 6, "mayb": 6, "underli": [6, 9, 22], "solv": 6, "successfulli": [6, 25], "certain": [6, 18, 20, 21, 23, 24], "exceed": [6, 16], "simul": [6, 8, 9, 14, 15, 22, 23], "enter": 6, "invalid": 6, "action_spac": [6, 16, 24, 26], "correspond": [6, 15], "valid": [6, 16, 23], "all": [6, 9, 16, 17, 18, 20, 21, 23, 25], "For": [6, 16, 20, 22, 23, 25], "discret": [6, 16], "give": 6, "mean": 6, "ar": [6, 8, 9, 16, 18, 20, 21, 22, 25], "two": [6, 8, 12, 15, 22, 24], "1": [6, 16, 18, 20, 21, 23, 24, 25], "box": [6, 15, 16, 18, 20, 21], "3": [6, 8, 9, 14, 15, 16, 18, 20, 21, 22, 23, 24, 25], "4028234663852886e": 6, "38": [6, 23], "4": [6, 18, 23, 25], "float32": [6, 18, 20, 21], "shape": [6, 16, 18, 20, 21], "denot": [6, 18, 20, 21, 24], "arrai": [6, 16, 18, 26], "we": [6, 12, 16, 18, 20, 21, 22, 23, 24], "well": 6, "high": [6, 21, 22, 23], "8000002e": 6, "00": 6, "4028235e": 6, "1887903e": 6, "01": 6, "dtype": 6, "low": [6, 21, 23], "northbound_interface_cli": 6, "traslat": 6, "dataformat": 6, "northboundcli": 7, "sever": 7, "repli": 7, "start": [7, 8, 9, 10, 23, 24, 25], "request": [7, 8], "where": [7, 16, 18, 21, 22, 23], "load": [7, 16, 18, 20, 21, 23], "recv": 7, "receiv": [7, 8, 10, 16, 20, 21, 25], "messag": [7, 8, 9, 22], "process_measur": 7, "reply_json": 7, "process": [7, 8, 24, 25], "compris": [8, 15, 23], "core": [8, 22], "These": [8, 26], "establish": [8, 9, 15, 16, 25], "via": [8, 11, 25], "design": [8, 18, 22, 26], "southbound": [8, 10, 12, 15, 16, 22, 25], "serv": [8, 18, 20, 22, 23], "bridg": 8, "facilit": [8, 9, 15, 16, 22], "statist": [8, 18, 20, 21, 23], "keep": [8, 15, 23], "aliv": 8, "period": [8, 9, 17, 19, 20, 21], "dispatch": [8, 9], "hello": [8, 9, 25], "upon": [8, 9], "disengag": 8, "n": [8, 9, 14, 15, 16, 18, 20, 21, 22], "smulat": 8, "instig": 8, "plan": [8, 12, 16], "incorpor": 8, "emul": [8, 15], "testb": [8, 15, 23, 25], "altern": 8, "earmark": 8, "futur": 8, "releas": [8, 12], "depict": [8, 15], "flow": [8, 20, 23], "complet": [8, 25], "cycl": 8, "within": [8, 15, 16, 18, 23, 25], "session": [8, 15, 16, 18, 20, 21, 24], "launch": [8, 9, 16, 25], "env_config": [8, 9, 10, 24, 25], "trigger": [8, 26], "gener": [8, 10, 18, 20, 21, 24, 25], "incom": 8, "onc": [8, 16, 18, 20, 21, 24, 25], "conclud": 8, "map": [8, 12, 15, 16], "onli": [8, 9, 20, 23, 25], "env_sim": [8, 9, 10, 25], "ani": [8, 16, 20], "given": [8, 18, 20, 21], "moment": [8, 18], "cannot": [8, 18, 20, 21, 24], "occur": 8, "simultan": 8, "standpoint": 8, "treat": 8, "both": [8, 16, 18, 19, 20, 21, 23, 24], "equival": 8, "identifi": 8, "them": [8, 16, 18, 20, 22], "entiti": [8, 9, 22, 25], "networkgymsim": 9, "env_list": [9, 25], "recept": 9, "its": [9, 15, 18, 20], "socket": [9, 10, 11, 25], "ident": [9, 10, 11], "identif": 9, "subsequ": [9, 18, 20, 21, 24], "commenc": 9, "conclus": 9, "close": 9, "reconnect": 9, "point": [9, 18, 20, 21, 23, 24], "perceiv": 9, "divis": 9, "advantag": [9, 26], "straightforward": [9, 16, 25], "expans": 9, "test": [9, 14, 20, 23, 25], "while": [9, 17, 18, 24], "support": [9, 15, 16, 20, 25], "non": [9, 16], "offic": 9, "account": [9, 18], "env_ident": 10, "client_ident": 10, "msg_json": 10, "random": [10, 16, 18, 20, 21], "sampl": [10, 16, 24, 26], "when": [10, 12, 18, 20, 21, 22, 23, 25, 26], "resum": 10, "env_idennt": 10, "env_port": 10, "first": [10, 16, 20, 21, 24], "who": 10, "msg": [10, 25], "cliet": 10, "generate_dummy_measur": 10, "num_us": 10, "ad": 10, "start_simul": 10, "api": [10, 14, 26], "report": 10, "run_one_interv": 10, "interv": [10, 16], "southbound_interfac": 11, "southbound_connect": 11, "indent": 11, "zmq": 11, "manag": [12, 16, 20, 21, 22], "select": [12, 15, 16, 18, 19, 20, 21, 25], "idl": 12, "instanc": [12, 16, 20, 22, 23, 25], "rout": [12, 15], "tabl": 12, "At": [12, 15, 18, 20, 21, 22, 24], "present": [12, 15, 16, 20, 25], "do": 12, "softwar": [12, 22], "email": 13, "github": [13, 18, 20, 21, 25], "real": 14, "world": [14, 22], "dataset": 14, "control": [14, 20, 22], "oper": [14, 18, 20, 21, 22, 24], "difficult": 14, "acquir": 14, "align": [14, 25], "usag": [14, 18], "itself": 14, "enough": 14, "train": [14, 16, 18, 20, 21, 22], "reinforc": [14, 22, 26], "etc": [14, 22], "current": 14, "enabl": [14, 15, 16, 21, 22, 23, 26], "multi": 14, "access": [14, 18, 22, 23, 25], "traffic": [14, 23], "split": [14, 19, 23], "awar": 14, "steer": [14, 19], "cellular": [14, 17, 20, 21], "ran": [14, 16, 22], "slice": 14, "tool": [14, 22], "often": 14, "veri": 14, "complex": 14, "especi": 14, "research": [14, 15, 16, 22], "without": [14, 20, 22], "expertis": [14, 22], "lack": [14, 20, 23], "common": 14, "simpl": [14, 16], "evalu": [14, 20, 25], "benchmark": 14, "adher": [14, 18], "addition": [14, 15, 16, 25], "offer": [14, 15, 22, 23, 26], "framework": [15, 22], "consist": [15, 16, 22, 23], "essenti": [15, 16, 22, 25], "each": [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26], "plai": [15, 22], "crucial": [15, 22], "role": [15, 22, 26], "system": [15, 16, 18, 22, 23], "encompass": 15, "seamless": 15, "interact": [15, 22, 24, 25, 26], "displai": 15, "below": [15, 16, 23, 24, 26], "graphic": 15, "architectur": [15, 22], "visual": [15, 16], "aid": 15, "divers": [15, 25], "collabor": [15, 16], "harmoni": 15, "form": 15, "streamlin": [15, 22, 25], "effect": [15, 16, 22], "servic": [15, 17, 18, 20, 22], "tailor": [15, 18, 22], "advanc": 15, "ai": [15, 16], "develop": [15, 16, 22], "By": [15, 18, 22], "click": 15, "blue": 15, "navig": 15, "directli": 15, "page": [15, 22], "respect": [15, 16, 18], "main": 15, "respons": 15, "allow": [15, 16, 22, 26], "compat": 15, "like": [15, 18, 22], "stabl": [15, 22], "baselines3": [15, 22], "cleanrl": [15, 22], "desir": [15, 20], "central": 15, "maintain": [15, 22, 23], "track": 15, "assign": [15, 18, 20, 21, 25], "dure": [15, 20], "either": [15, 16, 18, 20, 21], "through": [15, 16, 18, 20, 21, 22, 24, 25], "distinct": [15, 18, 22], "machin": [16, 18, 20, 21, 22], "requst": 16, "mlwin": 16, "ring": 16, "univers": 16, "public": [16, 22], "internet": [16, 22], "intel": 16, "issu": [16, 23], "feel": 16, "free": 16, "u": [16, 25], "netaigym": [16, 25], "gmail": [16, 25], "com": [16, 25], "sim": 16, "aa": 16, "devcloud": 16, "avail": [16, 20, 22, 26], "meanwhil": [16, 18], "enhanc": 16, "capabl": 16, "5g": 16, "distribut": [16, 18, 20, 21], "energi": 16, "save": 16, "predict": 16, "more": [16, 18, 20, 21, 22], "gain": 16, "begin": 16, "download": [16, 18, 20, 21], "your": [16, 22, 23], "prompt": 16, "collect": [16, 22, 26], "forward": [16, 25], "norhtbound": 16, "nb": 16, "algorithm": [16, 18, 22], "store": 16, "relev": 16, "transmit": [16, 18, 20, 21, 23, 25], "sb": [16, 25], "continu": [16, 18, 20, 21, 24], "conveni": 16, "websit": 16, "demonstr": [16, 24, 25], "packag": 16, "networkgymenv": [16, 18, 20, 21, 24], "client_id": [16, 18, 20, 21, 24], "argument": 16, "classic": 16, "loop": [16, 22], "implement": [16, 18, 20, 22], "load_config_fil": [16, 18, 20, 21, 24], "env_nam": [16, 24, 25], "nqos_split": [16, 21, 24], "num_step": [16, 24], "1000": [16, 24], "rang": [16, 18, 23, 24, 26], "exit": [16, 18, 20, 21, 24], "break": [16, 24], "epsiod": [16, 24], "up": [16, 24], "still": [16, 24], "anoth": [16, 24], "keyword": 16, "associ": 16, "dedic": [16, 17, 18], "worker": 16, "until": 16, "parallel": 16, "obtain": 16, "perform": [16, 17, 19, 20, 21, 24], "As": 16, "along": [16, 18, 20, 21], "One": [16, 23], "multipl": [16, 18, 20, 21], "fix": 16, "restart": 16, "scenario": [16, 20, 22, 23], "sequenti": 16, "success": 16, "insight": 16, "time": [16, 18, 20, 21, 23], "constraint": [16, 18, 20], "found": 16, "handl": [16, 18, 20, 21], "limit": [16, 18, 20, 21, 25], "illustr": [16, 23, 24], "everi": [16, 18, 20, 21], "attribut": 16, "understand": 16, "expect": [16, 25], "output": [16, 23, 25], "instead": 16, "prefer": 16, "empti": [16, 22, 26], "shown": [16, 25, 26], "np": [16, 26], "inherit": 16, "major": 16, "possibl": [16, 20], "might": [16, 23], "describ": 16, "dimension": 16, "upper": 16, "lower": 16, "our": [16, 18, 22, 25], "shift": 16, "tupl": 16, "multibinari": 16, "binari": 16, "multidiscret": [16, 20], "wrapper": [16, 18, 20, 21], "maximum": [16, 18, 20, 23], "clipact": 16, "clip": 16, "li": 16, "rescaleact": [16, 18, 20, 21], "rescal": [16, 18, 20, 21], "lie": 16, "timeawareobserv": 16, "about": [16, 18, 20, 21, 22], "index": [16, 23], "ensur": [16, 18, 20, 21, 23], "transit": 16, "markov": 16, "flattenobserv": 16, "flatten": 16, "normalizeobserv": [16, 18, 20, 21], "normal": [16, 18, 20, 21], "t": [16, 18, 25], "coordin": [16, 23], "center": [16, 22], "unit": [16, 25], "varianc": 16, "wrap": 16, "arg": 16, "normal_obs_env": 16, "among": [17, 18], "priorit": [17, 18, 20, 23], "share": [17, 18, 25], "strive": [17, 18], "meet": [17, 18, 20, 23], "level": [17, 18, 20], "agreement": [17, 18], "entir": [18, 20, 21, 24], "partit": [18, 22], "percept": 18, "possess": 18, "abil": 18, "great": 18, "effici": [18, 20], "belong": 18, "mac": 18, "schedul": [18, 20], "proport": 18, "fair": 18, "guarante": 18, "equit": 18, "imparti": 18, "inf": [18, 20, 21], "config": [18, 20, 21], "network_sl": 18, "pose": 18, "challeng": [18, 20], "compet": 18, "finit": 18, "primari": [18, 20], "strateg": [18, 21], "vlab": [18, 20, 21, 25], "multidimension": 18, "ndarrai": [18, 20, 21], "five": 18, "total": [18, 20], "mbp": [18, 20, 21, 25], "fraction": 18, "express": 18, "percentag": [18, 23], "sum": 18, "across": [18, 20], "equal": [18, 21, 23], "averag": 18, "violat": [18, 20, 23], "wise": 18, "record": 18, "experienc": 18, "millisecond": 18, "min": [18, 20, 21], "max": [18, 20, 21], "elabor": [18, 20, 21, 23], "note": [18, 20, 21, 23, 24], "exce": 18, "surpass": 18, "appropri": 18, "scale": 18, "down": 18, "softmax": 18, "mathemat": 18, "sum_": 18, "a_i": 18, "quad": 18, "frac": 18, "j": 18, "a_j": 18, "num": [18, 21], "factor": 18, "cost": 18, "formul": 18, "left": 18, "text": 18, "_i": 18, "lambda": 18, "cdot": 18, "delay_violation_r": 18, "gamma": 18, "rb_usage_r": 18, "adjust": [18, 20, 25], "emphasi": 18, "consider": 18, "repo": [18, 20, 21, 25], "detail": [18, 20, 21, 22, 26], "uniform": [18, 20, 21], "2d": [18, 20, 21], "plane": [18, 20, 21], "x": [18, 20, 21, 23], "y": [18, 20, 21, 23], "boundari": [18, 20, 21], "instal": [18, 20, 21, 25], "walk": [18, 20, 21], "mobil": [18, 20, 21], "model": [18, 20, 21, 22], "episodes_per_sess": [18, 20, 21, 24], "steps_per_episod": [18, 20, 21, 24], "l": [18, 20, 21, 24], "happen": [18, 20, 21], "length": [18, 20, 21, 24], "reconfigur": [18, 20, 21, 24], "program": [18, 20, 21, 22, 24], "mx": [19, 20, 21], "ratio": [19, 21, 23], "consid": [19, 20, 21], "lte": [19, 20, 21, 23, 25], "link": [19, 20, 21, 23, 25], "part": [20, 21], "dimens": 20, "qos_steer": 20, "randomli": [20, 21], "intellig": 20, "direct": [20, 22, 23, 25], "aim": [20, 21], "achiev": [20, 21, 23], "best": 20, "qualiti": 20, "regard": 20, "halt": 20, "admiss": 20, "capac": [20, 21, 23], "10": [20, 23, 25], "accommod": [20, 22], "drop": 20, "remain": 20, "On": 20, "hand": 20, "contend": 20, "restrict": 20, "qos_requir": 20, "test_duration_m": 20, "500": 20, "durat": 20, "delay_bound_m": [20, 23], "100": [20, 23], "delay_violation_target": 20, "02": 20, "target": 20, "loss_target": 20, "001": 20, "loss": 20, "packet": [20, 23], "otherwis": 20, "met": 20, "set": 20, "zero": 20, "estim": [20, 21], "channel": [20, 21, 22], "third": [20, 21], "combin": [20, 21, 23], "mechan": 20, "maxim": [20, 21], "lead": 20, "essenc": 20, "optim": [20, 22, 26], "indirectli": 20, "overal": 20, "problem": 21, "station": 21, "closest": 21, "handov": 21, "disabl": 21, "latenc": 21, "transmitt": 21, "f": 21, "owd": [21, 23, 25], "innov": 22, "concept": 22, "open": 22, "yield": 22, "wherea": 22, "flexibl": [22, 26], "languag": 22, "platform": 22, "separ": 22, "freedom": 22, "emploi": [22, 23], "variou": 22, "smoothli": 22, "c": 22, "leverag": 22, "prevent": 22, "secur": 22, "oversight": 22, "independ": 22, "deploy": 22, "deploi": 22, "workload": 22, "approach": 22, "thei": 22, "four": 22, "purpos": [22, 23, 26], "offlin": [22, 26], "own": [22, 26], "special": [22, 26], "art": [22, 26], "sota": [22, 26], "tutori": [22, 25, 26], "guidanc": 22, "instruct": [22, 25, 26], "convers": 22, "comprehens": 22, "kei": 22, "overview": 22, "focus": 22, "layer": [22, 23], "involv": [22, 23, 25], "abstract": 22, "power": 22, "aspect": 22, "endeavor": 22, "full": 22, "stack": 22, "edg": 22, "cloud": 22, "fidel": 22, "proprietari": [22, 25], "applic": [22, 23], "xapp": 22, "rapp": 22, "ric": 22, "digit": 22, "twin": [22, 26], "person": 23, "match": 23, "experiment": 23, "cid": [23, 25], "end_t": [23, 25], "start_t": [23, 25], "dl": [23, 25], "6000": 23, "gma": [23, 25], "cell_id": 23, "5900": 23, "phy": [23, 25], "delay_test_1_viol": 23, "72": 23, "99270072992701": 23, "delay_test_2_viol": 23, "delay_viol": 23, "89": 23, "8989898989899": 23, "max_owd": 23, "499": 23, "538": 23, "239": 23, "195": 23, "6": [23, 25], "7": [23, 25], "8": [23, 25], "max_rat": [23, 25], "35": 23, "22": 23, "9": [23, 25], "78": 23, "65": 23, "measurement_ok": 23, "11": 23, "missed_act": 23, "12": 23, "484": 23, "517": 23, "214": 23, "102": 23, "13": 23, "491": 23, "217": 23, "145": 23, "14": 23, "15": 23, "prioriti": 23, "16": 23, "17": 23, "18": 23, "19": 23, "20": 23, "352": 23, "056": 23, "912": 23, "45": 23, "992": 23, "21": 23, "472": 23, "336": 23, "24": 23, "848": 23, "928": 23, "23": 23, "split_ratio": [23, 25], "32": 23, "29": 23, "25": 23, "traffic_ratio": 23, "55": 23, "90": 23, "34": 23, "26": 23, "66": 23, "27": 23, "tx_rate": 23, "636": 23, "757": 23, "52": 23, "681": 23, "28": 23, "x_loc": 23, "871206061072092": 23, "702857783599929": 23, "198": 23, "y_loc": 23, "964088643728281": 23, "6756194439050196": 23, "0212": 23, "field": 23, "explan": 23, "signifi": 23, "downlink": 23, "ul": 23, "uplink": 23, "converg": 23, "now": 23, "cell": 23, "255": 23, "delay_test_": 23, "_violat": 23, "threshold": 23, "_thresh_m": 23, "reorder": 23, "order": 23, "count": 23, "too": 23, "long": 23, "wait": 23, "therefor": 23, "alwai": 23, "mark": 23, "70": 23, "deliveri": 23, "cover": 23, "sinc": 23, "sine": 23, "To": [23, 26], "iterrow": 23, "df_rate": 23, "explod": 23, "structur": 23, "occasion": 23, "absent": 23, "address": 23, "popul": 23, "modifi": [23, 25, 26], "section": [24, 25], "outlin": 24, "showcas": 24, "inclus": 25, "extern": 25, "equip": 25, "ll": 25, "ultim": 25, "merg": 25, "procedur": 25, "setup": 25, "port": 25, "alter": 25, "8087": 25, "session_nam": 25, "session_kei": 25, "network_gym_env": 25, "common_config": 25, "accord": 25, "start_custom_env": 25, "py": 25, "would": 25, "don": 25, "grant": 25, "demo": [25, 26], "Then": 25, "start_client_demo": 25, "print": 25, "custom_act": 25, "custom_tag": 25, "9269856811": 25, "5833047032": 25, "6873341799": 25, "0909367353": 25, "3403381109": 25, "0730143189": 25, "4166952968": 25, "3126658201": 25, "9090632796": 25, "6596618891": 25, "20000": 25, "21000": 25, "sole": 25, "ve": 25, "re": 25, "readi": 25, "mirror": 25, "uml": 25, "sequenc": 25, "diagram": 25, "locat": 25, "experi": 25, "contact": 25, "integr": [25, 26], "fulfil": 26, "simpli": 26, "popular": 26, "ones": 26, "ppo": 26, "proxim": 26, "ddpg": 26, "deep": 26, "determinist": 26, "gradient": 26, "sac": 26, "soft": 26, "actor": 26, "critic": 26, "td3": 26, "a2c": 26, "moreov": 26, "seamlessli": 26}, "objects": {"network_gym_client": [[2, 0, 1, "", "Adapter"], [6, 0, 1, "", "Env"], [7, 0, 1, "", "NorthBoundClient"]], "network_gym_client.Adapter": [[2, 1, 1, "", "df_to_dict"], [2, 1, 1, "", "fill_empty_feature"], [2, 1, 1, "", "get_nested_json_policy"], [2, 1, 1, "", "wandb_log"], [2, 1, 1, "", "wandb_log_buffer_append"]], "network_gym_client.Env": [[6, 2, 1, "", "action_space"], [6, 2, 1, "", "adapter"], [6, 2, 1, "", "northbound_interface_client"], [6, 2, 1, "", "observation_space"], [6, 1, 1, "", "reset"], [6, 1, 1, "", "step"]], "network_gym_client.NorthBoundClient": [[7, 1, 1, "", "connect"], [7, 1, 1, "", "process_measurement"], [7, 1, 1, "", "recv"], [7, 1, 1, "", "send"]], "network_gym_client.envs.network_slicing": [[3, 0, 1, "", "Adapter"]], "network_gym_client.envs.network_slicing.Adapter": [[3, 1, 1, "", "get_action_space"], [3, 1, 1, "", "get_observation"], [3, 1, 1, "", "get_observation_space"], [3, 1, 1, "", "get_policy"], [3, 1, 1, "", "get_rbg_size"], [3, 1, 1, "", "get_reward"]], "network_gym_client.envs.nqos_split": [[4, 0, 1, "", "Adapter"]], "network_gym_client.envs.nqos_split.Adapter": [[4, 1, 1, "", "get_action_space"], [4, 1, 1, "", "get_observation"], [4, 1, 1, "", "get_observation_space"], [4, 1, 1, "", "get_policy"], [4, 1, 1, "", "get_reward"], [4, 1, 1, "", "netowrk_util"]], "network_gym_client.envs.qos_steer": [[5, 0, 1, "", "Adapter"]], "network_gym_client.envs.qos_steer.Adapter": [[5, 1, 1, "", "calculate_wifi_qos_user_num"], [5, 1, 1, "", "get_action_space"], [5, 1, 1, "", "get_observation"], [5, 1, 1, "", "get_observation_space"], [5, 1, 1, "", "get_policy"], [5, 1, 1, "", "get_reward"]], "network_gym_env": [[9, 0, 1, "", "Configure"], [10, 0, 1, "", "DummySim"]], "network_gym_env.Configure": [[9, 1, 1, "", "run"]], "network_gym_env.DummySim": [[10, 1, 1, "", "generate_dummy_measurement"], [10, 1, 1, "", "run_one_interval"], [10, 1, 1, "", "start_simulation"]], "network_gym_env.southbound_interface": [[11, 1, 1, "", "southbound_connect"]]}, "objtypes": {"0": "py:class", "1": "py:function", "2": "py:attribute"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "function", "Python function"], "2": ["py", "attribute", "Python attribute"]}, "titleterms": {"build": 0, "document": 0, "websit": 0, "instal": 0, "depend": 0, "us": 0, "tip": 0, "auto": 0, "gener": 0, "rst": 0, "file": 0, "add": 0, "class": [0, 2], "function": 0, "md": 0, "network_gym_cli": [1, 6, 7], "adapt": [2, 3, 4, 5], "The": 2, "base": 2, "method": [2, 3, 4, 5, 6, 7, 9, 10, 11], "network_sl": 3, "reward": [3, 4, 5, 18, 20, 21, 23], "addit": [3, 4, 5, 7], "nqos_split": 4, "qos_steer": 5, "env": 6, "attribut": 6, "northbound": 7, "network_gym_env": [8, 9, 10, 11], "networkgym": [8, 14, 15, 16, 22], "uml": 8, "sequenc": 8, "diagram": 8, "configur": 9, "dummi": [10, 25], "simul": [10, 16, 25], "dummysim": 10, "southbound": 11, "network_gym_serv": 12, "contact": 13, "motiv": 14, "network": [14, 17, 18, 22], "ai": [14, 22], "model": 14, "algorithm": [14, 26], "develop": 14, "cycl": 14, "challeng": 14, "face": 14, "": 14, "approach": 14, "address": 14, "thi": 14, "overview": 15, "compon": 15, "interfac": 15, "client": [15, 16], "api": [15, 22], "server": 15, "environ": [15, 16, 25], "quickstart": 16, "access": [16, 20, 21], "servic": 16, "via": 16, "vlab": 16, "basic": 16, "usag": 16, "upon": 16, "start": [16, 18, 20, 21], "follow": 16, "seri": 16, "step": 16, "occur": 16, "dure": 16, "process": 16, "repeat": 16, "when": 16, "conclud": 16, "initi": [16, 25], "interact": 16, "explain": 16, "code": [16, 24], "action": [16, 18, 20, 21], "observ": [16, 18, 20, 21, 23], "space": [16, 18, 20, 21], "modifi": 16, "slice": [17, 18], "cellular": 18, "descript": [18, 20, 21], "prerequisit": [18, 20, 21], "argument": [18, 20, 21], "state": [18, 20, 21], "episod": [18, 20, 21], "end": [18, 20, 21], "traffic": [19, 20, 21], "manag": 19, "multi": [20, 21], "qo": 20, "steer": 20, "split": 21, "transit": 21, "dynam": 21, "democrat": 22, "benefit": 22, "agent": [22, 26], "gymnasium": 22, "scope": 22, "limit": [22, 24], "custom": [23, 25, 26], "work": 23, "measur": 23, "column": 23, "row": 23, "retriev": 23, "fill": 23, "miss": 23, "data": 23, "handl": 24, "time": 24, "truncat": 24, "termin": 24, "sequenti": 24, "train": [24, 26], "exampl": 24, "python": 24, "implement": 25, "your": 25, "connect": 25, "substitut": 25, "releas": 25, "system": 26, "default": 26, "stabl": 26, "baselines3": 26, "cleanrl": 26}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"Build Documentation Website": [[0, "build-documentation-website"]], "Install Dependencies": [[0, "install-dependencies"]], "Build Website": [[0, "build-website"]], "Useful Tips": [[0, "useful-tips"]], "Auto Generate rst Files": [[0, "auto-generate-rst-files"]], "Add Classes and Functions to md Files": [[0, "add-classes-and-functions-to-md-files"]], "network_gym_client": [[1, "network-gym-client"]], "Adapter": [[2, "adapter"]], "The Base Class": [[2, "the-base-class"]], "Methods": [[2, "methods"], [3, "methods"], [4, "methods"], [5, "methods"], [6, "methods"], [7, "methods"], [9, "methods"], [10, "methods"], [11, "methods"]], "network_slicing Adapter": [[3, "network-slicing-adapter"]], "": [[3, "id1"], [4, "id1"], [5, "id1"]], "Reward Methods": [[3, "reward-methods"], [5, "reward-methods"]], "Additional Methods": [[3, "additional-methods"], [4, "additional-methods"], [5, "additional-methods"], [7, "additional-methods"]], "nqos_split Adapter": [[4, "nqos-split-adapter"]], "Reward Method": [[4, "reward-method"]], "qos_steer Adapter": [[5, "qos-steer-adapter"]], "Env": [[6, "env"]], "network_gym_client.Env": [[6, "network-gym-client-env"]], "Attributes": [[6, "attributes"]], "NorthBound": [[7, "northbound"]], "network_gym_client.NorthBound": [[7, "network-gym-client-northbound"]], "network_gym_env": [[8, "network-gym-env"]], "NetworkGym UML Sequence Diagram": [[8, "networkgym-uml-sequence-diagram"]], "Configure": [[9, "configure"]], "network_gym_env.Configure": [[9, "network-gym-env-configure"]], "Dummy Simulator": [[10, "dummy-simulator"]], "network_gym_env.DummySim": [[10, "network-gym-env-dummysim"]], "SouthBound": [[11, "southbound"]], "network_gym_env.SouthBound": [[11, "network-gym-env-southbound"]], "network_gym_server": [[12, "network-gym-server"]], "Contact": [[13, "contact"]], "Motivation": [[14, "motivation"]], "Network AI Models/Algorithms Development Cycle": [[14, "network-ai-models-algorithms-development-cycle"]], "Challenges Faced by Network AI Developers": [[14, "challenges-faced-by-network-ai-developers"]], "NetworkGym\u2019s Approach to Addressing this Challenge": [[14, null], [14, null], [14, null]], "Overview": [[15, "overview"]], "NetworkGym Components and Interfaces": [[15, "networkgym-components-and-interfaces"]], "Client API": [[15, "client-api"]], "Server API": [[15, "server-api"]], "Environment API": [[15, "environment-api"]], "Quickstart": [[16, "quickstart"]], "Accessing the NetworkGym Service via vLab": [[16, "accessing-the-networkgym-service-via-vlab"]], "Basic Usage": [[16, "basic-usage"]], "\u25b6\ufe0f Upon starting the Client, the following series of steps occur:": [[16, null]], "\ud83d\udd01 During the simulation, the process repeats as follows:": [[16, null]], "\u23f9\ufe0f When the NetworkGym or the simulation concludes:": [[16, null]], "Initializing Environments": [[16, "initializing-environments"]], "Interacting with the Environment": [[16, "interacting-with-the-environment"]], "Explaining the code": [[16, "explaining-the-code"]], "Action and observation spaces": [[16, "action-and-observation-spaces"]], "Modifying the environment": [[16, "modifying-the-environment"]], "Network Slicing": [[17, "network-slicing"]], "Cellular Network Slicing": [[18, "cellular-network-slicing"]], "Description": [[18, "description"], [20, "description"], [21, "description"]], "Prerequisite": [[18, "prerequisite"], [20, "prerequisite"], [21, "prerequisite"]], "Observation Space": [[18, "observation-space"], [20, "observation-space"], [21, "observation-space"]], "Action Space": [[18, "action-space"], [20, "action-space"], [21, "action-space"]], "Reward": [[18, "reward"], [20, "reward"], [21, "reward"]], "Arguments": [[18, "arguments"], [20, "arguments"], [21, "arguments"]], "Starting State": [[18, "starting-state"], [20, "starting-state"], [21, "starting-state"]], "Episode End": [[18, "episode-end"], [20, "episode-end"], [21, "episode-end"]], "Traffic Management": [[19, "traffic-management"]], "Multi-Access QoS Traffic Steering": [[20, "multi-access-qos-traffic-steering"]], "Multi-Access Traffic Splitting": [[21, "multi-access-traffic-splitting"]], "Transition Dynamics": [[21, "transition-dynamics"]], "NetworkGym: Democratizing Network AI": [[22, "networkgym-democratizing-network-ai"]], "Benefits of NetworkGym": [[22, "benefits-of-networkgym"]], "Agent": [[22, "agent"]], "Gymnasium API": [[22, "gymnasium-api"]], "NetworkGym API": [[22, "networkgym-api"]], "NetworkGym Scope and Limitations": [[22, "networkgym-scope-and-limitations"]], "Customizing Observation and Reward": [[23, "customizing-observation-and-reward"]], "Working with the Measurement": [[23, "working-with-the-measurement"]], "Measurement Columns": [[23, "measurement-columns"]], "Measurement Rows": [[23, "measurement-rows"]], "Retrieving a Measurement": [[23, "retrieving-a-measurement"]], "Filling the Missing Data": [[23, "filling-the-missing-data"]], "Handling Time Limits": [[24, "handling-time-limits"]], "Truncation": [[24, "truncation"]], "Termination": [[24, "termination"]], "Sequential Training Example": [[24, "sequential-training-example"]], "Python code:": [[24, "python-code"]], "Implementing Custom Environment": [[25, "implementing-custom-environment"]], "Initiating your Custom Environment": [[25, "initiating-your-custom-environment"]], "Connecting to Your Custom Environment": [[25, "connecting-to-your-custom-environment"]], "Substituting the Dummy Simulator": [[25, "substituting-the-dummy-simulator"]], "Releasing Your Custom Environment": [[25, "releasing-your-custom-environment"]], "Training Agents": [[26, "training-agents"]], "System Default Agent": [[26, "system-default-agent"]], "Custom Algorithm Agent": [[26, "custom-algorithm-agent"]], "Stable-Baselines3 Agent": [[26, "stable-baselines3-agent"]], "CleanRL Agent": [[26, "cleanrl-agent"]]}, "indexentries": {"adapter (class in network_gym_client)": [[2, "network_gym_client.Adapter"]], "df_to_dict() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.df_to_dict"]], "fill_empty_feature() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.fill_empty_feature"]], "get_nested_json_policy() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.get_nested_json_policy"]], "wandb_log() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.wandb_log"]], "wandb_log_buffer_append() (in module network_gym_client.adapter)": [[2, "network_gym_client.Adapter.wandb_log_buffer_append"]], "adapter (class in network_gym_client.envs.network_slicing)": [[3, "network_gym_client.envs.network_slicing.Adapter"]], "get_action_space() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_action_space"]], "get_observation() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_observation"]], "get_observation_space() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_observation_space"]], "get_policy() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_policy"]], "get_rbg_size() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_rbg_size"]], "get_reward() (in module network_gym_client.envs.network_slicing.adapter)": [[3, "network_gym_client.envs.network_slicing.Adapter.get_reward"]], "adapter (class in network_gym_client.envs.nqos_split)": [[4, "network_gym_client.envs.nqos_split.Adapter"]], "get_action_space() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_action_space"]], "get_observation() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_observation"]], "get_observation_space() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_observation_space"]], "get_policy() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_policy"]], "get_reward() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.get_reward"]], "netowrk_util() (in module network_gym_client.envs.nqos_split.adapter)": [[4, "network_gym_client.envs.nqos_split.Adapter.netowrk_util"]], "adapter (class in network_gym_client.envs.qos_steer)": [[5, "network_gym_client.envs.qos_steer.Adapter"]], "calculate_wifi_qos_user_num() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.calculate_wifi_qos_user_num"]], "get_action_space() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_action_space"]], "get_observation() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_observation"]], "get_observation_space() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_observation_space"]], "get_policy() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_policy"]], "get_reward() (in module network_gym_client.envs.qos_steer.adapter)": [[5, "network_gym_client.envs.qos_steer.Adapter.get_reward"]], "env (class in network_gym_client)": [[6, "network_gym_client.Env"]], "action_space (network_gym_client.env attribute)": [[6, "network_gym_client.Env.action_space"]], "adapter (network_gym_client.env attribute)": [[6, "network_gym_client.Env.adapter"]], "northbound_interface_client (network_gym_client.env attribute)": [[6, "network_gym_client.Env.northbound_interface_client"]], "observation_space (network_gym_client.env attribute)": [[6, "network_gym_client.Env.observation_space"]], "reset() (in module network_gym_client.env)": [[6, "network_gym_client.Env.reset"]], "step() (in module network_gym_client.env)": [[6, "network_gym_client.Env.step"]], "northboundclient (class in network_gym_client)": [[7, "network_gym_client.NorthBoundClient"]], "connect() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.connect"]], "process_measurement() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.process_measurement"]], "recv() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.recv"]], "send() (in module network_gym_client.northboundclient)": [[7, "network_gym_client.NorthBoundClient.send"]], "configure (class in network_gym_env)": [[9, "network_gym_env.Configure"]], "run() (in module network_gym_env.configure)": [[9, "network_gym_env.Configure.run"]], "dummysim (class in network_gym_env)": [[10, "network_gym_env.DummySim"]], "generate_dummy_measurement() (in module network_gym_env.dummysim)": [[10, "network_gym_env.DummySim.generate_dummy_measurement"]], "run_one_interval() (in module network_gym_env.dummysim)": [[10, "network_gym_env.DummySim.run_one_interval"]], "start_simulation() (in module network_gym_env.dummysim)": [[10, "network_gym_env.DummySim.start_simulation"]], "southbound_connect() (in module network_gym_env.southbound_interface)": [[11, "network_gym_env.southbound_interface.southbound_connect"]]}}) \ No newline at end of file diff --git a/tutorials/customizing_observation_and_reward.html b/tutorials/customizing_observation_and_reward.html index 648f5a2..804c7b6 100644 --- a/tutorials/customizing_observation_and_reward.html +++ b/tutorials/customizing_observation_and_reward.html @@ -246,35 +246,37 @@

Customizing Observation and Reward#

Personalizing the observation and reward functions to match your experimental goals is achievable within the provided environments. Within the Adapter class for each environment, both the get_observation and get_reward functions take a network statistics measurement as input. An illustration of such a network statistics measurement is provided below:

-
      cid direction end_ts group             name start_ts          user                                              value
-0     LTE        DL   6000   GMA            ap_id     5900  [0, 1, 2, 3]                       [255.0, 255.0, 255.0, 255.0]
-1   Wi-Fi        DL   6000   GMA            ap_id     5900  [0, 1, 2, 3]                               [0.0, 0.0, 1.0, 1.0]
-2     All        DL   6000   GMA  delay_violation     5900  [0, 1, 2, 3]                       [100.0, 100.0, 100.0, 100.0]
-3     All        DL   6000   GMA          max_owd     5900  [0, 1, 2, 3]                       [335.0, 703.0, 422.0, 299.0]
-4     LTE        DL   6000   GMA          max_owd     5900  [0, 1, 2, 3]                       [335.0, 703.0, 422.0, 299.0]
-5   Wi-Fi        DL   6000   GMA          max_owd     5900  [0, 1, 2, 3]                               [0.0, 1.0, 1.0, 0.0]
-6     LTE        DL   6000   PHY         max_rate     5900  [0, 1, 2, 3]                           [35.0, 35.0, 22.0, 35.0]
-7   Wi-Fi        DL   6000   PHY         max_rate     5900  [0, 1, 2, 3]                           [78.0, 78.0, 65.0, 78.0]
-8     All        DL   6000   GMA   measurement_ok     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 1.0]
-9     All        DL   6000   GMA    missed_action     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
-10    All        DL   6000   GMA              owd     5900  [0, 1, 2, 3]                       [327.0, 680.0, 403.0, 279.0]
-11    LTE        DL   6000   GMA              owd     5900  [0, 1, 2, 3]                       [327.0, 680.0, 404.0, 280.0]
-12  Wi-Fi        DL   6000   GMA              owd     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
-13    LTE        DL   6000   GMA      qos_marking     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 0.0]
-14  Wi-Fi        DL   6000   GMA      qos_marking     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 0.0]
-15    All        DL   6000   GMA         qos_rate     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
-16    LTE        DL   6000   GMA         qos_rate     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
-17  Wi-Fi        DL   6000   GMA         qos_rate     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
-18    All        DL   6000   GMA             rate     5900  [0, 1, 2, 3]                       [15.912, 9.056, 7.2, 14.984]
-19    LTE        DL   6000   GMA             rate     5900  [0, 1, 2, 3]                       [8.472, 8.472, 5.336, 8.472]
-20  Wi-Fi        DL   6000   GMA             rate     5900  [0, 1, 2, 3]                        [0.696, 4.64, 3.016, 4.992]
-21    LTE        DL   6000   GMA      split_ratio     5900  [0, 1, 2, 3]                           [31.0, 16.0, 19.0, 22.0]
-22  Wi-Fi        DL   6000   GMA      split_ratio     5900  [0, 1, 2, 3]                            [1.0, 16.0, 13.0, 10.0]
-23    LTE        DL   6000   GMA    traffic_ratio     5900  [0, 1, 2, 3]                           [92.0, 65.0, 64.0, 63.0]
-24  Wi-Fi        DL   6000   GMA    traffic_ratio     5900  [0, 1, 2, 3]                            [8.0, 35.0, 36.0, 37.0]
-25    All        DL   6000   GMA          tx_rate     5900  [0, 1, 2, 3]                     [17.075, 9.408, 7.434, 15.797]
-26    All        DL   6000   GMA            x_loc     5900  [0, 1, 2, 3]  [12.040140997999378, 6.710302486045565, 52.547...
-27    All        DL   6000   GMA            y_loc     5900  [0, 1, 2, 3]  [6.167369006263322, 2.450729590703729, 9.45877...
+
      cid direction end_ts group                    name start_ts          user                                              value
+0   Wi-Fi        DL   6000   GMA                 cell_id     5900  [0, 1, 2, 3]                               [0.0, 0.0, 1.0, 1.0]
+1     LTE        DL   6000   PHY                 cell_id     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 1.0]
+2     All        DL   6000   GMA  delay_test_1_violation     5900  [0, 1, 2, 3]             [100.0, 100.0, 72.99270072992701, 0.0]
+3     All        DL   6000   GMA  delay_test_2_violation     5900  [0, 1, 2, 3]                           [100.0, 100.0, 0.0, 0.0]
+4     All        DL   6000   GMA         delay_violation     5900  [0, 1, 2, 3]            [100.0, 100.0, 100.0, 89.8989898989899]
+5     All        DL   6000   GMA                 max_owd     5900  [0, 1, 2, 3]                       [499.0, 538.0, 239.0, 195.0]
+6     LTE        DL   6000   GMA                 max_owd     5900  [0, 1, 2, 3]                       [499.0, 538.0, 239.0, 195.0]
+7   Wi-Fi        DL   6000   GMA                 max_owd     5900  [0, 1, 2, 3]                               [3.0, 2.0, 3.0, 4.0]
+8     LTE        DL   6000   PHY                max_rate     5900  [0, 1, 2, 3]                           [35.0, 35.0, 22.0, 35.0]
+9   Wi-Fi        DL   6000   PHY                max_rate     5900  [0, 1, 2, 3]                           [78.0, 78.0, 65.0, 78.0]
+10    All        DL   6000   GMA          measurement_ok     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 1.0]
+11    All        DL   6000   GMA           missed_action     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
+12    All        DL   6000   GMA                     owd     5900  [0, 1, 2, 3]                       [484.0, 517.0, 214.0, 102.0]
+13    LTE        DL   6000   GMA                     owd     5900  [0, 1, 2, 3]                       [491.0, 517.0, 217.0, 145.0]
+14  Wi-Fi        DL   6000   GMA                     owd     5900  [0, 1, 2, 3]                               [0.0, 1.0, 0.0, 0.0]
+15    LTE        DL   6000   GMA                priority     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 0.0]
+16  Wi-Fi        DL   6000   GMA                priority     5900  [0, 1, 2, 3]                               [1.0, 1.0, 1.0, 1.0]
+17    All        DL   6000   GMA                qos_rate     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
+18    LTE        DL   6000   GMA                qos_rate     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
+19  Wi-Fi        DL   6000   GMA                qos_rate     5900  [0, 1, 2, 3]                               [0.0, 0.0, 0.0, 0.0]
+20    All        DL   6000   GMA                    rate     5900  [0, 1, 2, 3]                    [13.352, 9.056, 15.912, 45.992]
+21    LTE        DL   6000   GMA                    rate     5900  [0, 1, 2, 3]                        [8.472, 8.472, 5.336, 8.24]
+22  Wi-Fi        DL   6000   GMA                    rate     5900  [0, 1, 2, 3]                     [6.848, 0.928, 10.336, 15.912]
+23    LTE        DL   6000   GMA             split_ratio     5900  [0, 1, 2, 3]                             [17.0, 32.0, 9.0, 3.0]
+24  Wi-Fi        DL   6000   GMA             split_ratio     5900  [0, 1, 2, 3]                            [15.0, 0.0, 23.0, 29.0]
+25    LTE        DL   6000   GMA           traffic_ratio     5900  [0, 1, 2, 3]                           [55.0, 90.0, 34.0, 34.0]
+26  Wi-Fi        DL   6000   GMA           traffic_ratio     5900  [0, 1, 2, 3]                           [45.0, 10.0, 66.0, 66.0]
+27    All        DL   6000   GMA                 tx_rate     5900  [0, 1, 2, 3]                     [14.636, 9.757, 14.52, 38.681]
+28    All        DL   6000   GMA                   x_loc     5900  [0, 1, 2, 3]  [13.871206061072092, 6.702857783599929, 52.198...
+29    All        DL   6000   GMA                   y_loc     5900  [0, 1, 2, 3]  [7.964088643728281, 1.6756194439050196, 9.0212...
 
@@ -331,62 +333,66 @@

Measurement Rows

0,1

-

ap_id

+

cell_id

LTE cell ID and Wi-Fi access point ID as measured by each user. (NOTE: 255 is the default value, representing no measurement.)

-

2

+

2,3

+

delay_test_*_violation

+

One-way delay violation percentage (%) –for testing purpose– as measured by each user; delay threshold (delay_test_*_thresh_ms) can be configured in the JSON file.

+ +

4

delay_violation

One-way delay violation percentage (%) as measured by each user; delay bound (delay_bound_ms) can be configured in the JSON file. (NOTE: Only for QoS use case)

-

3,4,5

+

5,6,7

max_owd

Maximum one-way delay measured by each user, involving LTE link, Wi-Fi link, and ALL. (ALL: after reordering out-of-order packets from both links).

-

6,7

+

8,9

max_rate

LTE/Wi-Fi link capacity as measured by each user.

-

8

+

10

measurement_ok

1: Measurement is valid; 0: An issue exists with the measurement.

-

9

+

11

missed_action

Count of missed actions by the environment. (NOTE: Applicable in testbed environment where RL agent might take too long to compute an action. Simulator waits for action by default in simulations, therefore should always be 0.)

-

10,11,12

+

12,13,14

owd

One-way delay measured by each user, involving LTE link, Wi-Fi link, and ALL. (ALL: after reordering out-of-order packets from both links).

-

13,14

-

qos_marking

-

1: QoS user; 0: Non-QoS user.

+

15,16

+

priority

+

1: high priority; 0: low priority. When Dynamic Flow Prioritization is enabled, for each cell, mark 70%~90% of traffic or users to high priority.

-

15,16,17

+

17,18,19

qos_rate

QoS delivery rate (output traffic throughput meeting QoS requirement) as measured by each user, comprising traffic over LTE link, Wi-Fi link, and ALL (combined).

-

18,19,20

+

20,21,22

rate

Delivery rate (output traffic throughput) measured by each user, including traffic over LTE link, Wi-Fi link, and ALL (combined).

-

21,22

+

23,24

split_ratio

Traffic split ratio (in range of [0, 32]) as measured by each user, covering LTE link, Wi-Fi link. LTE split ratio + Wi-Fi split ratio equals 32.

-

23,34

+

25,26

traffic_ratio

Traffic ratio (%) sending to each link measured by each user, involving LTE link, Wi-Fi link. traffic_ratio might not equal split_ratio, since the system takes sine time to apply the new action.

-

25

+

27

tx_rate

Load (input traffic throughput) measured by each user.

-

26

+

28

x_loc

x coordinate per user.

-

27

+

29

y_loc

y coordinate per user.

@@ -396,26 +402,17 @@

Measurement Rows

Retrieving a Measurement#

-

To retrieve a specific network statistic, such as rate, you can utilize the following code:

-
df_rate = df[df['name'] == 'rate'].reset_index(drop=True) # get the rate
-
-
-

For isolating the rate measurement to a specific link, such as All, you can execute the subsequent code:

-
df_rate = df_rate[df_rate['cid'] == 'All'].reset_index(drop=True) # get the rate for the all link combined
+

To retrieve a specific network statistic, such as rate, over a specifi link, such as All, you can utilize the following code:

+
 for index, row in df.iterrows():
+            if row['name'] == 'rate':
+                if row['cid'] == 'All':
+                    df_rate = row
 
-

Lastly, employ the explode function to transform the nested data frame into its original structure:

+

Optionally, employ the explode function to transform the row object into the dataframe structure:

df_rate = df_rate.explode(column=['user', 'value']) #keep the flow rate.
 
-

This is the final result of the rate for each user, considering the combination of All links:

-
   cid direction end_ts group  name start_ts user   value
-0  All        DL   6000   GMA  rate     5900    0   13.24
-0  All        DL   6000   GMA  rate     5900    1  18.464
-0  All        DL   6000   GMA  rate     5900    2   6.968
-0  All        DL   6000   GMA  rate     5900    3   19.28
-
-

Filling the Missing Data#