def update_current_center(self, space=None, new_center=None):

        if not (type(space)) is tuple:
            node_nc = space.key2node(new_center)
            if not (new_center == space.center):
                direction = Funct.node2direction(node_nc)
                if direction[1] == (1, 0, 0, 0):
                    self.center = self.center + 1
                elif direction[1] == (-1, 0, 0, 0):
                    self.center = self.center - 1

        if self.observations:
            node_new_c = space.graph.node2key
            lef_weight = sum([
                observation.weight for observation in self.observations
                if observation.path[0] < 0
            ])
            right_weight = sum([
                observation.weight for observation in self.observations
                if observation.path[0] > 0
            ])
            center_weight = sum([
                observation.weight for observation in self.observations
                if observation.path[0] == 0
            ])
            if center_weight > max(lef_weight, center_weight):
                pass
            elif right_weight > lef_weight:
                self.center = self.center + 1
            elif right_weight < lef_weight:
                self.center = self.center - 1
 def node2obs(self, space, node):
     creator = self.observation_creator
     weight = Funct.node2num_particles(node)
     path = list(Funct.node2direction(node))
     path[0] = path[0] - self.center
     num_conv_layers = len(
         [0 for layer in space.node2key(node) if layer[0] == 0])
     return creator(num_layer=num_conv_layers, path=path, weight=weight)
    def update_current_path(self,space, new_center):
        
        if not isinstance(space, tuple) and new_center is not None:
            node_nc = space.key2node(new_center)
            absolute_direction = Funct.node2direction(node_nc)
            relative_direction = Funct.absolute2relative(direction=absolute_direction, last_layer=self.last_mutated_layer,
                                                            max_layers=self.max_layers_condition)
            self.current_path.path.append(relative_direction)
            self.current_path.absolute_path.append(absolute_direction)

            if len(self.current_path.path)>self.max_path_size:
                self.current_path.path.pop(0)
                self.current_path.absolute_path.pop(0)
    def register_observations(self,space,new_center=None):
        
        creator=self.observation_creator
        if type(space) is tuple:
            num_conv_layers = len([0 for layer in space if
                layer[0] == 0])
            self.current_num_layer=num_conv_layers
            if new_center:
                self.center_key=new_center
            else:
                self.center_key=space
        else:
            if new_center:
                self.center_key=new_center
            else:
                self.center_key=space.center
            center=space.center
            self.current_num_layer=len([0 for layer in new_center if
                layer[0] == 0])
            node_c=space.key2node(center)
            
            self.observations = []
            
            weight_array = []
            i = 0
            for node in node_c.kids:

                if Funct.node2energy(node) > 0:
                    weight_array.append(Funct.node2energy(node)*10)

            weight_array = Funct.normalize(dataset=weight_array)
            for node in node_c.kids:

                if Funct.node2energy(node) > 0:

                    observation_path = []
                    for direction in self.current_path.path:
                        observation_path.append(direction)

                    absolute_direction = Funct.node2direction(node)
                    relative_direction = Funct.absolute2relative(direction=absolute_direction, last_layer=self.last_mutated_layer, 
                                                                    max_layers=self.max_layers_condition)
                    observation_path.append(relative_direction)

                    if len(observation_path) > self.max_observation_size:
                        observation_path.pop(0)
                    
                    observation = self.observation_creator(path=observation_path, weight=weight_array[i])
                    self.observations.append(observation)

                    i += 1