In the util module split_tree does not have num_features_per_node as paramter, but you have used it as a paramter in training_navigation.py
# As defined in observation_utils.py
def split_tree(tree, current_depth=0):
    
    num_features_per_node = TreeObsForRailEnv.observation_dim
    if len(tree) < num_features_per_node:
        return [], [], []
    depth = 0
    tmp = len(tree) / num_features_per_
# Code in training_navigation.py
        ....
        # Split the observation tree into its parts and normalize the observation using the utility functions.
        # Build agent specific local observation
        for a in range(env.get_num_agents()):
            rail_data, distance_data, agent_data = split_tree(tree=np.array(obs[a]),
                                                              current_depth=0)
            rail_data = norm_obs_clip(rail_data)
            distance_data = norm_obs_clip(distance_data)
            agent_data = np.clip(agent_data, -1, 1)
            agent_obs[a] = np.concatenate((np.concatenate((rail_data, distance_data)), agent_data))
        ....
when the parameter is removed, I get the following error.
AttributeError: type object 'TreeObsForRailEnv' has no attribute 'observation_dim'
I then manually specified num_features_per_node = 9 in observation_utils, but then the state size reduces to 45 from 168 (Using the code from training_navigation.py for env generation).