Exemplo n.º 1
0
static struct gale_packet *cat_filter(struct gale_packet *msg,void *d) {
	struct directed *dir = (struct directed *) d;
	struct gale_packet *rewrite;
	struct gale_text cat = null_text;
	int do_transmit = 0;

	gale_create(rewrite);
	rewrite->routing = null_text;
	rewrite->content = msg->content;
	while (gale_text_token(msg->routing,':',&cat)) {
		struct gale_text base,host;
		int orig_flag;
		int flag = is_directed(cat,&orig_flag,&base,&host) && orig_flag
			&& !gale_text_compare(host,dir->host);
		base = category_escape(base,flag);
		do_transmit |= flag;
                rewrite->routing = 
			gale_text_concat(3,rewrite->routing,G_(":"),base);
        }

	if (!do_transmit) {
		gale_dprintf(5,"*** no positive categories; dropped message\n");
		return NULL;
	}

        /* strip leading colon */
        if (rewrite->routing.l > 0) 
		rewrite->routing = gale_text_right(rewrite->routing,-1);
	gale_dprintf(5,"*** \"%s\": rewrote categories to \"%s\"\n",
	             gale_text_to(gale_global->enc_console,dir->host),
	             gale_text_to(gale_global->enc_console,rewrite->routing));
	return rewrite;
}
Exemplo n.º 2
0
 bool operator()(const Edge& e) const {
   if (is_directed(m_g))
     return source(e, m_g) == m_u && target(e, m_g) == m_v;
   else
     return (source(e, m_g) == m_u && target(e, m_g) == m_v)
       || (source(e, m_g) == m_v && target(e, m_g) == m_u);
 }
Exemplo n.º 3
0
// layer-specific attribute stores are initialized if needed
AttributeStoreSharedPtr MLNetwork::edge_features(const LayerSharedPtr& layer1, const LayerSharedPtr& layer2) {
	if (edge_attributes.count(layer1->id)==0 || edge_attributes.at(layer1->id).count(layer2->id)==0) {
		edge_attributes[layer1->id][layer2->id] = AttributeStore::create();
		if (!is_directed(layer1,layer2))
			edge_attributes[layer2->id][layer1->id] = edge_attributes[layer1->id][layer2->id];
	}
	return edge_attributes[layer1->id][layer2->id];
}
Exemplo n.º 4
0
void subscr_transmit(
	oop_source *src,
	struct gale_packet *msg,struct connect *avoid) 
{
	struct gale_text cat = null_text;
	struct gale_packet *rewrite;
	while (gale_text_token(msg->routing,':',&cat)) {
		struct gale_text host;
		if (is_directed(cat,NULL,NULL,&host)) 
			send_directed(src,host);
	}

	++stamp;
	assert(list == NULL);
	cat = null_text;
	gale_create(rewrite);
	rewrite->routing = null_text;
	rewrite->content = msg->content;
	while (gale_text_token(msg->routing,':',&cat)) {
		struct gale_text base,host;
		int flag;
		gale_dprintf(3,"*** transmitting \"%s\"\n",
		             gale_text_to(gale_global->enc_console,cat));
		is_directed(cat,&flag,&base,&host);
		transmit(&root,base,avoid,flag);
		base = category_escape(base,1);
		rewrite->routing = 
			gale_text_concat(3,rewrite->routing,G_(":"),base);
	}

	/* strip leading colon */
	if (rewrite->routing.l > 0) 
		rewrite->routing = gale_text_right(rewrite->routing,-1);

	while (list != NULL) {
		if (list->flag) {
			gale_dprintf(4,"[%p] sending message\n",list->link);
			send_connect(list->link,rewrite);
		}
		list = list->next;
	}
}
Exemplo n.º 5
0
void Graph<VertexDataType, EdgeDataType>::remove_edge(int u, int v) {

  assert(1 <= u && u <= vertices() && 1 <= v && v <= vertices());

  u--; v--;

  if (contains_edge(u + 1, v + 1)) {
    number_of_edges_--;

    int pos = search(u, v);

    adjacent_lists_[u].erase(pos + adjacent_lists_[u].begin());

    if (!is_directed()) {
      pos = search(v, u);
      adjacent_lists_[v].erase(pos + adjacent_lists_[v].begin());
    }
  }

}
Exemplo n.º 6
0
void Graph<VertexDataType, EdgeDataType>::add_edge(int u, int v, EdgeDataType edge_data) {

  assert(1 <= u && u <= vertices() && 1 <= v && v <= vertices());

  u--; v--;

  int pos = search(u, v);

  if (pos == -1) {
    number_of_edges_++;
    adjacent_lists_[u].push_back(Edge(u, v, edge_data));
  }

  if (!is_directed()) {
    pos = search(v, u);
    if (pos == -1) {
      number_of_edges_++;
      adjacent_lists_[v].push_back(Edge(v, u, edge_data));
    }
  }

}
Exemplo n.º 7
0
static void subscr(oop_source *src,struct gale_text spec,struct connect *link,
                   void (*func)(struct node *,struct gale_text,struct sub *),
                   void (*dir)(oop_source *,struct gale_text))
{
	struct gale_text cat = null_text;
	struct sub sub;
	sub.priority = 0;
	gale_create(sub.connect);
	sub.connect->stamp = stamp;
	sub.connect->link = link;

	/* easy escape */
	if (!gale_text_compare(spec,G_("-"))) return;

	gale_dprintf(3,"--- subscribing to all of \"%s\"\n",
		gale_text_to(gale_global->enc_console,spec));

	while (gale_text_token(spec,':',&cat)) {
		struct gale_text host,base;
		if (is_directed(cat,&sub.flag,&base,&host)) dir(src,host);
		func(&root,base,&sub);
		++sub.priority;
	}
}
Exemplo n.º 8
0
EdgeSharedPtr MLNetwork::add_edge(const NodeSharedPtr& node1, const NodeSharedPtr& node2) {
	EdgeSharedPtr check = get_edge(node1,node2);
	if (check) return NULL;
	edge_id eid = ++max_edge_id;
	bool edge_directed = is_directed(node1->layer,node2->layer);
	EdgeSharedPtr new_edge_v1_v2(new edge(eid,node1,node2,edge_directed));
	cidx_edge_by_nodes[node1->id][node2->id] = new_edge_v1_v2;
	sidx_neighbors_out[node1->id].insert(node2->id,node2);
	sidx_neighbors_in[node2->id].insert(node1->id,node1);
	sidx_neighbors_all[node1->id].insert(node2->id,node2);
	sidx_neighbors_all[node2->id].insert(node1->id,node1); // if node1 and node2 are the same, it also works
	sidx_edges_by_layer_pair[node1->layer->id][node2->layer->id].insert(eid,new_edge_v1_v2);
	edges.insert(eid,new_edge_v1_v2);
	if (!edge_directed) {
		// create an additional edge with the same identifier but inverted nodes
		EdgeSharedPtr new_edge_v2_v1(new edge(eid,node2,node1,edge_directed));
		cidx_edge_by_nodes[node2->id][node1->id] = new_edge_v2_v1;
		sidx_neighbors_out[node2->id].insert(node1->id,node1);
		sidx_neighbors_in[node1->id].insert(node2->id,node2);
		if (node1->layer->id!=node2->layer->id)
			sidx_edges_by_layer_pair[node2->layer->id][node1->layer->id].insert(eid,new_edge_v2_v1);
	}
	return new_edge_v1_v2;
}
Exemplo n.º 9
0
 bool is_undirected(const Graph& g) {
     return !is_directed(g);
 }
Exemplo n.º 10
0
void create_network(NETWORK *network)
{
  int i;
  int length;
  char *ptr;
  char *start,*stop;
  char line[LINELENGTH];
  char label[LINELENGTH];

  // Determine whether the network is directed

  network->directed = is_directed();

  // Count the vertices

  network->nvertices = count_vertices();

  // Make space for the vertices

  network->vertex = calloc(network->nvertices,sizeof(VERTEX));

  // Go through the file reading the details of each vertex one by one

  reset_buffer();
  for (i=0; i<network->nvertices; i++) {

    // Skip to next "node" entry

    do {
      next_line(line);
    } while (strstr(line,"node")==NULL);

    // Read in the details of this vertex

    do {

      // Look for ID

      ptr = strstr(line,"id");
      if (ptr!=NULL) sscanf(ptr,"id %i",&network->vertex[i].id);

      // Look for label

      ptr = (strstr(line,"label"));
      if (ptr!=NULL) {
	start = strchr(line,'"');
	if (start==NULL) {
	  sscanf(ptr,"label %s",&label);
	} else {
	  stop = strchr(++start,'"');
	  if (stop==NULL) length = strlen(line) - (start-line);
	  else length = stop - start;
	  strncpy(label,start,length);
	  label[length] = '\0';
	  network->vertex[i].label = malloc((length+1)*sizeof(char));
	  strcpy(network->vertex[i].label,label);
	}
      }

      // If we see a closing square bracket we are done

      if (strstr(line,"]")!=NULL) break;

    } while (next_line(line)==0);

  }

  // Sort the vertices in increasing order of their IDs so we can find them
  // quickly later

  qsort(network->vertex,network->nvertices,sizeof(VERTEX),(void*)cmpid);
}