Exemple #1
0
bool graph_add_edge(graph_t *g, void *from, void *to, void *label)
{
    assert(list_has(g->nodes, g->comp, from) && list_has(g->nodes, g->comp, to));
    edge_t  *e = new_edge();
    e->from = from;
    e->to = to;
    e->label = label;
    list_add(g->edges, e);
    return true;
}
Exemple #2
0
void testLISTHAS()
{
    list_t *l = list_new();
    list_add(l, strdup("hello"));
    list_add(l, strdup("world"));

    CU_ASSERT_FALSE(list_has(l, streq, "HELLO"));
    CU_ASSERT(list_has(l, streq, "hello"));

    list_foreach(l, free);
    list_free(l);
}
Exemple #3
0
void *get_min_distance_node(list_t *distanceLabels, comparator_t comp,
                            list_t *visited)
{
    assert(distanceLabels);

    int minDist = -1;
    void *minLabel = NULL;
    iter_t *it;
    for (it = iter(distanceLabels); !iter_done(it); iter_next(it))
        {
            distance_label_t *itdl = iter_get(it);
            if (itdl->dist == -1) // inte varit där
                {
                    continue;
                }
            if (list_has(visited, comp, itdl->label)) // finns redan i visited, abort
                {
                    continue;
                }
            if (minDist == -1 || itdl->dist < minDist)// om inte ändrats en enda gång eller nya distansen 'r mindre än förra minsta distans.
                {
                    minDist = itdl->dist;
                    minLabel = itdl->label;
                }
        }
    iter_free(it);
    return minLabel;
}
Exemple #4
0
void dijkstra(graph_t *g, void *current, void *to, list_t *visited,
              list_t *distanceLabels)
{
    assert(g);
    assert(current);
    assert(to);
    assert(visited);
    assert(distanceLabels);
    while (true)
      {
	if (!list_has(visited, g->comp, current))
	  {
	    list_t *unvisited_neighs = unvisited_neighbors(g, current, visited);
	    distance_label_t *here =
	      get_distance_label(distanceLabels, current, g->comp);
	    
	    iter_t *it;
	    for (it = iter(unvisited_neighs); !iter_done(it); iter_next(it))
	      {
		void *neigh = iter_get(it);
		
		int line = list_quickest_line(g->nodes, current, neigh, here->arrival_time);
		//	printf("med linje:%i i dijkstra\n",line);
		      
		assert(line);
		edge_t *edge = graph_get_edge(g,line,current,here->path_edges);
		assert(edge);
		list_t *tentativePath = list_clone(here->path);
		list_t *tentativeEdgePath = list_clone(here->path_edges);
		list_add(tentativePath, neigh);
		list_add(tentativeEdgePath, edge);

		char *bussDepart = list_next_dep_time(g->nodes,current,neigh,line,here->arrival_time);
		assert(bussDepart);
		int total_distance = graph_add_penalty(edge, here->arrival_time, bussDepart);// egen rad
		
		char *new_arrival_time = add_duration(bussDepart, network_get_dur(edge->label)); //egen rad
		//free(bussDepart);	        				  
		update_distance(distanceLabels, neigh, g->comp, here->dist + total_distance,
				tentativePath, tentativeEdgePath, new_arrival_time); //la till new_arrival_tim. ost-bågen borde gå in här!!
	      }
	    iter_free(it);
	    list_free(unvisited_neighs);
	  }
	list_add(visited, current);
	
	if (g->comp(current, to))
	  {
	    return;
	  }
	
	current = get_min_distance_node(distanceLabels, g->comp, visited);
	assert(current);
      }
}
Exemple #5
0
bool graph_add_node(graph_t *g, void *label)
{
    if (list_has(g->nodes, g->comp, label))
        {
            return false;
        }
    else
        {
            list_add(g->nodes, label);
            return true;
        }
}
Exemple #6
0
static void validate_list(int index, struct list *list) {

    int i;

    assert(list);

    for(i=0; i < 4; i++) {

        if (i != wdref[index])
            continue;

        assert(list_has(list, pathref[index], cmp));
    }
}
Exemple #7
0
list_t *unvisited_neighbors(graph_t *g, void *current, list_t *visited)
{
    list_t *neighs = graph_find_neighbors(g, current);

    list_t *unvisited_neighs = list_new();
    iter_t *nit;
    for (nit = iter(neighs); !iter_done(nit); iter_next(nit))
        {
            void *neigh = iter_get(nit);
            if (!list_has(visited, g->comp, neigh))
                {
                    list_add(unvisited_neighs, neigh);
                }
        }
    iter_free(nit);
    list_free(neighs);
    return unvisited_neighs;
}
Exemple #8
0
void testFINDNEIGHBORS()
{
    graph_t *g = mkGraphABCDE();

    graph_add_edge(g, "A", "B", NULL);

    list_t *neighs = graph_find_neighbors(g, "A");

    CU_ASSERT(list_has(neighs, streq, "B"))
    CU_ASSERT(list_len(neighs) == 1);
    list_free(neighs);

    // adding an additional neighbor:
    graph_add_edge(g, "A", "C", NULL);
    neighs = graph_find_neighbors(g, "A");
    CU_ASSERT(list_has(neighs, streq, "B"));
    CU_ASSERT(list_has(neighs, streq, "C"));
    CU_ASSERT(list_len(neighs) == 2);
    list_free(neighs);

    // the graph is directed:
    graph_add_edge(g, "C", "A", NULL);
    neighs = graph_find_neighbors(g, "A");
    CU_ASSERT(list_has(neighs, streq, "B"));
    CU_ASSERT(list_has(neighs, streq, "C"));
    CU_ASSERT(list_len(neighs) == 2);
    list_free(neighs);

    // add an unrelated edge
    graph_add_edge(g, "D", "E", NULL);
    neighs = graph_find_neighbors(g, "A");
    CU_ASSERT(list_has(neighs, streq, "B"));
    CU_ASSERT(list_has(neighs, streq, "C"));
    CU_ASSERT(list_len(neighs) == 2);
    list_free(neighs);

    freeGraphABCDE(g);
}
Exemple #9
0
bool graph_has_node(graph_t *g, void *label)
{
    return list_has(g->nodes, g->comp, label);
}
Exemple #10
0
bool graph_check_node_exist(graph_t *g, char *from, char *to) //EGEN FUNKTION
{
  if(list_has(g->nodes, g->comp, from) && list_has(g->nodes, g->comp, to)) return true;
  else return false;
   
}