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 @@
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
-
+
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
-
+
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
-
+
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 Rows0,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#