def node_by_id(self, id_): """ Returns first node with given id. """ for n in self.nodes(): if (n.id == id_): return n logger.error('Network has no node with id %d.' % id_) return None
def add_node(self, node=None, pos=None, ori=None, commRange=None): """ Add node to network. Attributes: `node` -- node to add, default: new node is created `pos` -- position (x,y), default: random free position in environment `ori` -- orientation from 0 to 2*pi, default: random orientation """ if (not node): node = Node(commRange=commRange) assert(isinstance(node, Node)) if not node.network: node.network = self else: logger.warning('Node is already in another network, can\'t add.') return None pos = pos if pos is not None else self.find_random_pos(n=100) ori = ori if ori is not None else rand() * 2 * pi ori = ori % (2 * pi) if (self._environment.is_space(pos)): Graph.add_node(self, node) self.pos[node] = array(pos) self.ori[node] = ori self.labels[node] = str(node.id) logger.debug('Node %d is placed on position %s.' % (node.id, pos)) self.recalculate_edges([node]) else: logger.error('Given position is not free space.') return node
def generate_random_network(self, net=None): """Basic method: generates network with randomly positioned nodes.""" #TODO: try some more advanced algorithm for situation when # both connected network and too small degree are needed # that is agnostic to actual dimensions of the environment steps = [0] while True: net = self._create_modify_network(net, steps[-1]) # print "here" if not net: break steps.append(self._are_conditions_satisfied(net)) if len(steps)>1000: break # Area was not being set earlier, resulting in a divide-by-zero. w, h = net.environment.im.shape self.area = w*h if steps[-1]==0: self.net_density = 1.0 * len(net)/self.area return net logger.error("Could not generate connected network with given " "parameters. Try removing and/or modifying some of " "them.")
def remove_node(self, node): """ Remove node from network. """ if node not in self.nodes(): logger.error("Node not in network") return Graph.remove_node(self, node) del self.pos[node] del self.labels[node] node.network = None logger.info('Node with id %d is removed.' % node.id)
def __delattr__(self, name): if name == "_wrapped": raise TypeError("can't delete _wrapped.") if self._wrapped is None: self._setup() delattr(self._wrapped, name) else: logger.error('For manual settings override use ' 'settings.configure(SETTING1=val1, SETTING2=val2) ' 'or PYMOTE_SETTINGS_MODULE.')
def remove_node(self, node): """ Remove node from network. """ if node not in self.nodes(): logger.error("Node not in network") return Graph.remove_node(self, node) del self.pos[node] del self.labels[node] node.network = None logger.debug('Node with id %d is removed.' % node.id)
def add_node(self, node=None, pos=None, ori=None, commRange=None, find_random=False): """ Add node to network. Attributes: `node` -- node to add, default: new node is created `pos` -- position (x,y), default: random free position in environment `ori` -- orientation from 0 to 2*pi, default: random orientation """ if (not node): node = Node(commRange=commRange or self.comm_range) if not node.commRange: node.commRange = commRange or self.comm_range assert (isinstance(node, Node)) if not node.network: node.network = self else: logger.warning('Node is already in another network, can\'t add.') return None pos = pos if (pos is not None and not isnan(pos[0])) else self.find_random_pos(n=100) ori = ori if ori is not None else rand() * 2 * pi ori = ori % (2 * pi) got_random = False if find_random and not self._environment.is_space(pos): pos = self.find_random_pos(n=100) got_random = True if (self._environment.is_space(pos)): Graph.add_node(self, node) self.pos[node] = array(pos) self.ori[node] = ori self.labels[node] = ('C' if node.type == 'C' else "") + str( node.id) logger.debug('Node %d is placed on position %s %s %s' % (node.id, pos, '[energy=%5.3f]' % node.power.energy if node.power.energy != EnergyModel.E_INIT else '', 'Random' if got_random else '')) self.recalculate_edges([node]) else: Node.cid -= 1 logger.error('Given position is not free space. [%s] %s' % (Node.cid, pos)) node = None return node
def __setattr__(self, name, value): if name == "_wrapped": # Assign to __dict__ to avoid infinite __setattr__ loops. self.__dict__["_wrapped"] = value else: if self._wrapped is None: self._setup() setattr(self._wrapped, name, value) else: logger.error('For manual settings override use' ' settings.configure(SETTING1=value1,' ' SETTING2=value2) or PYMOTE_SETTINGS_MODULE.')
def add_node(self, node=None, pos=None, ori=None, commRange=None, find_random=False): """ Add node to network. Attributes: `node` -- node to add, default: new node is created `pos` -- position (x,y), default: random free position in environment `ori` -- orientation from 0 to 2*pi, default: random orientation """ if (not node): node = Node(commRange=commRange or self.comm_range) if not node.commRange: node.commRange = commRange or self.comm_range assert(isinstance(node, Node)) if not node.network: node.network = self else: logger.warning('Node is already in another network, can\'t add.') return None pos = pos if (pos is not None and not isnan(pos[0])) else self.find_random_pos(n=100) ori = ori if ori is not None else rand() * 2 * pi ori = ori % (2 * pi) got_random = False if find_random and not self._environment.is_space(pos): pos = self.find_random_pos(n=100) got_random = True if (self._environment.is_space(pos)): Graph.add_node(self, node) self.pos[node] = array(pos) self.ori[node] = ori self.labels[node] = ('C' if node.type == 'C' else "") + str(node.id) logger.debug('Node %d is placed on position %s %s %s' % (node.id, pos, '[energy=%5.3f]' %node.power.energy if node.power.energy != EnergyModel.E_INIT else '', 'Random' if got_random else '')) self.recalculate_edges([node]) else: Node.cid -= 1 logger.error('Given position is not free space. [%s] %s' % (Node.cid, pos)) node = None return node
def generate_random_network(self, net=None): """Basic method: generates network with randomly positioned nodes.""" #TODO: try some more advanced algorithm for situation when # both connected network and too small degree are needed # that is agnostic to actual dimensions of the environment steps = [0] while True: net = self._create_modify_network(net, steps[-1]) if not net: break steps.append(self._are_conditions_satisfied(net)) if len(steps)>1000: break if steps[-1]==0: return net logger.error("Could not generate connected network with given " "parameters. Try removing and/or modifying some of " "them.")
def generate_random_network(self, net=None): """Basic method: generates network with randomly positioned nodes.""" #TODO: try some more advanced algorithm for situation when # both connected network and too small degree are needed # that is agnostic to actual dimensions of the environment steps = [0] while True: net = self._create_modify_network(net, steps[-1]) if not net: break steps.append(self._are_conditions_satisfied(net)) if len(steps) > 1000: break if steps[-1] == 0: return net logger.error("Could not generate connected network with given " "parameters. Try removing and/or modifying some of " "them.")
def statuserr(self, node, message): logger.error('Can\'t handle status %s.' % node.status)